在调用处理程序之前,您可以获取异常对象并将处理程序本身保持为单行。但是,您仍然需要承担大量的“Try / Except / Do / End”负担。
Procedure MyExceptionHandler(AException: Exception);
Begin
Log(AException);
ShowMessage(AException.Message);
raise AException;
End;
Procedure TForm3.Button1Click(Sender: TObject);
Begin
Try
Foo;
Except On E:Exception Do
MyExceptionHandler(Exception(AcquireExceptionObject));
End;
End;
然而,如果你只是想要摆脱事件处理程序中重复的错误处理代码,你可以尝试这个方法:
Procedure TForm3.ShowException(AProc : TProc);
Begin
Try
AProc;
Except On E:Exception Do Begin
Log(E);
ShowMessage(E.Message);
End; End;
End;
将您的事件处理程序代码简化为以下内容:
Procedure TForm3.Button1Click(Sender: TObject);
Begin
ShowException(Procedure Begin
Foo;
End);
End;
你也可以让它适用于函数,使用参数化函数:
Function TForm3.ShowException<T>(AFunc : TFunc<T>) : T;
Begin
Try
Result := AFunc;
Except On E:Exception Do Begin
Log(E);
ShowMessage(E.Message);
End; End;
End;
并使ShowException返回一个值(作为传递):
Procedure TForm3.Button1Click(Sender: TObject);
Var
V : Integer;
Begin
V := ShowException<Integer>(Function : Integer Begin
Result := Foo;
End);
End;
甚至可以让匿名过程直接触及外部作用域变量。
Procedure TForm3.Button1Click(Sender: TObject);
Var
V : Integer;
Begin
ShowException(Procedure Begin
V := Foo;
End);
End;
在匿名函数内部和外部作用域中定义的变量之间存在一些交互限制,但对于像这样简单的情况,您将会非常好。