Przed wywołaniem programu obsługi można uzyskać obiekt wyjątku i zachować tylko jedną warstwę obsługi. Jednak nadal masz wiele obciążeń "Spróbuj/Z wyjątkiem/Zrób/Zakończ".
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;
Jednakże, jeśli to, co tylko chcesz zrobić, to pozbyć się powtarzalnego kodu obsługi błędów w obsługi zdarzeń, można spróbować to:
Procedure TForm3.ShowException(AProc : TProc);
Begin
Try
AProc;
Except On E:Exception Do Begin
Log(E);
ShowMessage(E.Message);
End; End;
End;
Zmniejszenie swój kod obsługi zdarzenia to:
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;
można również zrobić to praca dla funkcji, za pomocą sparametryzowanych funkcji:
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;
i podejmowania ShowException zwrócić wartość (działając jako pośredni):
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;
Albo nawet podejmowania dotyku procedura anon bezpośrednio zmienną zakres zewnętrzny (s):
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;
istnieją pewne ograniczenia interakcji zmiennych z wnętrza ciała funkcji anonimowej i tych zdefiniowanych w zewnętrznym zakresie, ale w prostych przypadkach takich jak te, będziesz więcej niż w porządku.
Wystarczy ponownie podnieść go w zwykły sposób. Utrzymuje twój własny kod dokumentujący i nie zepsuł śladu stosu. –
tak, zdecydowanie chcę zachować stos! –
Jeśli chodzi o rejestrowanie wyjątków, o które prosisz, powinieneś rzucić okiem na madExcept, EurekaLog i/lub Jedi. Każda z nich lepiej radzi sobie z rejestrowaniem wyjątków, o jakim można marzyć. –