Вы можете получить объект исключения перед вызовом вашего обработчика и оставить один обработчик самим обработчиком. Тем не менее, у вас по-прежнему много бремени «попробовать / исключить / сделать / закончить».
Procedure MyExceptionHandler(AException: Exception);
Begin
Log(AException); // assuming it accepts an exception
ShowMessage(AException.Message);
raise AException; // the ref count will be leveled if you always raise it
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 // anon method
Foo; // if this call raises an exception, it will be handled by ShowException's handler
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 // anon method
Result := Foo; // if this call raises an exception, it will be handled by ShowException's handler
End);
End;
Или даже заставить процедуру anon напрямую коснуться внешней переменной (ей) области действия:
Procedure TForm3.Button1Click(Sender: TObject);
Var
V : Integer;
Begin
ShowException(Procedure Begin // anon method
V := Foo; // if this call raises an exception, it will be handled by ShowException's handler
End);
End;
Существуют некоторые ограничения на взаимодействие переменных внутри тела анонимной функции и тех, которые определены во внешней области видимости, но для простых случаев, подобных этим, вам будет более чем хорошо.