Best Practices für den Umgang mit Ausnahmen in C #

Die Ausnahmebehandlung ist die Technik zur Behandlung von Laufzeitfehlern in Ihrem Anwendungscode. Grundsätzlich gibt es zwei Kategorien von Ausnahmen: Ausnahmen, die von der Anwendung generiert werden, und solche, die von der Laufzeit generiert werden. Ausnahmen sollten mit Vorsicht behandelt werden - Sie sollten eine gute Vorstellung davon haben, wie Ausnahmen behandelt werden sollen und wann sie in Ihrem Code behandelt werden müssen. In diesem Beitrag werde ich einige Tipps und Best Practices für die Arbeit mit Ausnahmen in C # vorstellen.

Die Basisklasse für alle Ausnahmen in .NET ist Exception. Alle Ausnahmeklassen in der Ausnahmehierarchie leiten sich direkt oder indirekt von dieser Klasse ab. Die Klassen ApplicationException und SystemException werden von der Klasse Exception abgeleitet. Die Common Language Runtime (CLR) löst eine Instanz eines Typs aus, der von SystemException abgeleitet wird, wenn zur Laufzeit ein Fehler auftritt. Beachten Sie, dass Sie niemals SystemException abfangen oder eine Instanz von SystemException in den Code Ihrer Anwendung werfen sollten.

Leiten Sie beim Erstellen benutzerdefinierter Ausnahmeklassen immer von der Ausnahmeklasse und nicht von der ApplicationException-Klasse ab. Einer der Gründe dafür ist, dass eine Instanz von ApplicationException von der Anwendung und niemals von der Laufzeit ausgelöst wird. Wenn Sie eine Instanz von ApplicationException in Ihren Code einfügen, erhöhen Sie einfach den Aufrufstapel, ohne viel Wert hinzuzufügen.

Es ist ein schlechter Entwurfsansatz, die Ausnahmebehandlung zu verwenden, um Informationen von einer Methode zurückzugeben. Wenn Sie Ausnahmedaten von Ihrer Methode zurückgeben, ist Ihr Klassendesign falsch und sollte überprüft werden. Beachten Sie, dass Ausnahmen in der Methodenaufrufhierarchie auf die höhere Ebene gesprudelt werden und es nicht empfehlenswert ist, Ausnahmen in allen Ebenen Ihrer Anwendung zu behandeln. Sie sollten eine Ausnahme so weit oben in der Anrufhierarchie wie möglich behandeln. Sie können eine Ausnahme in der Präsentationsebene verwenden und dem Benutzer entsprechende Meldungen anzeigen, um den genauen aufgetretenen Fehler zu benachrichtigen.

Das erneute Auslösen einer Ausnahme ist erforderlich, wenn Sie eine Datenbanktransaktion zurücksetzen möchten. Es wird empfohlen, beim Schreiben von Ausnahmebehandlungsroutinen bestimmte Ausnahmen wie FileNotFoundException, IOException usw. und am Ende einen allgemeinen catch-Block mit der Exception-Klasse zu verwenden. Dies würde sicherstellen, dass Sie den genauen Fehler oder den spezifischen Fehler kennen, der aufgetreten ist. In der MSDN heißt es: "Die ApplicationException-Klasse enthält keine Informationen zur Ursache von Ausnahmen. In den meisten Szenarien sollten Instanzen dieser Klasse nicht ausgelöst werden. In Fällen, in denen diese Klasse instanziiert wird, sollte eine für Menschen lesbare Nachricht sein, die den Fehler beschreibt an den Konstruktor übergeben. "

Sie sollten try-catch-Blöcke verwenden, um Ausnahmen zu behandeln, und einen finally-Block verwenden, um die in Ihrem Programm verwendeten Ressourcen zu bereinigen. Der try-Block würde Code enthalten, der möglicherweise eine Ausnahme auslöst. Der catch-Block wird verwendet, um die im try-Block ausgelöste Ausnahme zu behandeln, und der finally-Block wird verwendet, um die Zuweisung von Ressourcen aufzuheben, die das Programm verwendet hat. Beachten Sie, dass die endgültige Ausführung des Blocks garantiert ist, unabhängig davon, ob eine Ausnahme aufgetreten ist oder nicht. Daher ist block schließlich der beste Ort in Ihrem Code, um die von Ihrem Programm verwendeten Ressourcen zu bereinigen.

Das folgende Codefragment zeigt, wie die Anweisung "using" zum Entsorgen von Ressourcen verwendet werden kann. Beachten Sie, dass die Anweisung "using" dem Block try - finally entspricht.

public string Read(string fileName)

{

try

{

string data;

using (StreamReader streamReader = new StreamReader(fileName))

{

data = streamReader.ReadToEnd();

}

return data;

}

catch (Exception)

{

throw;

}

}

Ausnahmen zu werfen ist teuer. Es ist eine schlechte Praxis, Ausnahmen erneut zu werfen. Wenn Sie Ausnahmen erneut werfen, verlieren Sie die Stapelverfolgung.

try

{

//Some code that might throw an exception

}

catch(Exception ex)

{

throw ex;

}

Verwenden Sie stattdessen einfach die Anweisung "throw", wenn Sie die Ausnahme in Ihrem Ausnahmehandler nicht behandeln und die Ausnahme in der Aufrufhierarchie nach oben weitergeben möchten.

try

{

//Some code that might throw an exception

}

catch(Exception ex)

{

throw;

}

Schlucken Sie niemals Ausnahmen - Sie sollten den aufgetretenen Fehler niemals verbergen. Es wird empfohlen, Ausnahmen in Ihrer Anwendung zu protokollieren. Wenn Sie Ausnahmen protokollieren, sollten Sie immer die Ausnahmeinstanz protokollieren, damit der gesamte Stack-Trace protokolliert wird und nicht nur die Ausnahmemeldung. Hier ist ein Beispiel, das dies veranschaulicht.

try

{

//Some code that might throw an exception

}

catch(Exception ex)

{

LogManager.Log(ex.ToString());

}

Sie sollten niemals Ausnahmen verwenden, um Geschäftsregeln in Ihrer Anwendung zu verbreiten oder auszuführen. Sie können Ausnahmen in Ihrem Code vermeiden, indem Sie die richtige Validierungslogik verwenden. Ausnahmen sollten in den meisten Fällen vermieden werden - Sie sollten sie nur verwenden, wenn sie benötigt werden.

Weitere Informationen finden Sie in diesem MSDN-Artikel.