Das Problem ist nicht der lokale Catch-Block, das Problem ist das Protokoll und der Rethrow . Behandeln Sie die Ausnahmebedingung oder schließen Sie sie mit einer neuen Ausnahmebedingung ab, die zusätzlichen Kontext hinzufügt, und lösen Sie diese aus. Andernfalls werden Sie für dieselbe Ausnahme auf mehrere doppelte Protokolleinträge stoßen.
Die Idee hier ist, die Fähigkeit zu verbessern , Ihre Anwendung zu debuggen.
Beispiel 1: Behandeln Sie es
try
{
doSomething();
}
catch (Exception e)
{
log.Info("Couldn't do something", e);
doSomethingElse();
}
Wenn Sie die Ausnahme behandeln, können Sie die Wichtigkeit des Ausnahmeprotokolleintrags leicht herabstufen, und es gibt keinen Grund, diese Ausnahme in der gesamten Kette durchzulaufen. Es ist schon erledigt.
Das Behandeln einer Ausnahme kann das Informieren von Benutzern über ein Problem, das Protokollieren des Ereignisses oder das einfache Ignorieren des Ereignisses umfassen.
HINWEIS: Wenn Sie eine Ausnahme absichtlich ignorieren, empfehle ich, in der leeren catch-Klausel einen Kommentar anzugeben, der klar angibt, warum. Dies lässt zukünftige Betreuer wissen, dass es sich nicht um einen Fehler oder eine verzögerte Programmierung handelte. Beispiel:
try
{
context.DrawLine(x1,y1, x2,y2);
}
catch (OutOfMemoryException)
{
// WinForms throws OutOfMemory if the figure you are attempting to
// draw takes up less than one pixel (true story)
}
Beispiel 2: Füge zusätzlichen Kontext hinzu und wirf
try
{
doSomething(line);
}
catch (Exception e)
{
throw new MyApplicationException(filename, line, e);
}
Das Hinzufügen von zusätzlichem Kontext (wie Zeilennummer und Dateiname im Parsing-Code) kann dazu beitragen, das Debuggen von Eingabedateien zu verbessern - vorausgesetzt, das Problem ist vorhanden. Dies ist eine Art Sonderfall. Wenn Sie eine Ausnahme in eine "ApplicationException" umbrechen, um sie umzubenennen, hilft dies nicht beim Debuggen. Stellen Sie sicher, dass Sie zusätzliche Informationen hinzufügen.
Beispiel # 3: Mach nichts mit der Ausnahme
try
{
doSomething();
}
finally
{
// cleanup resources but let the exception percolate
}
In diesem letzten Fall lassen Sie die Ausnahme einfach zu, ohne sie zu berühren. Der Ausnahmebehandler auf der äußersten Ebene kann die Protokollierung durchführen. Die finally
Klausel wird verwendet, um sicherzustellen, dass alle von Ihrer Methode benötigten Ressourcen bereinigt werden. Hier kann jedoch nicht protokolliert werden, dass die Ausnahme ausgelöst wurde.