Ausnahmen und Ausnahmebehandlung
Die C#-Funktionen zur Ausnahmebehandlung helfen Ihnen dabei, unerwartete oder außergewöhnliche Situationen zu verarbeiten, die beim Ausführen von Programmen auftreten können. Die Ausnahmebehandlung verwendet die Schlüsselwörter try
, catch
und finally
, um Aktionen zu testen, die möglicherweise nicht erfolgreich sind, um Fehler zu behandeln, wenn Sie entscheiden, dass dies vernünftig ist, und um später Ressourcen zu bereinigen. Ausnahmen können von der Common Language Runtime (CLR), von .NET bzw. anderen Drittanbieterbibliotheken oder vom Anwendungscode generiert werden. Ausnahmen werden mit dem Schlüsselwort throw
erstellt.
In vielen Fällen wird eine Ausnahme nicht von einer Methode ausgelöst, die von Ihrem Code direkt aufgerufen wurde, sondern von einer anderen Methode weiter unten in der Aufrufliste. Wenn eine Ausnahme ausgelöst wird, entlädt die CLR die Liste, sucht nach einer Methode mit einem catch
-Block für den spezifischen Ausnahmetyp und führt den ersten gefundenen catch
-Block aus. Wenn kein geeigneter catch
-Block in der Aufrufliste gefunden wird, beendet die CLR den Prozess und zeigt eine Meldung für den Benutzer an.
In diesem Beispiel testet eine Methode, ob eine Division durch Null möglich ist, und fängt den Fehler ab. Ohne Ausnahmebehandlung würde dieses Programm mit dem Fehler DivideByZeroException wurde nicht behandelt beendet.
public class ExceptionTest
{
static double SafeDivision(double x, double y)
{
if (y == 0)
throw new DivideByZeroException();
return x / y;
}
public static void Main()
{
// Input for test purposes. Change the values to see
// exception handling behavior.
double a = 98, b = 0;
double result;
try
{
result = SafeDivision(a, b);
Console.WriteLine("{0} divided by {1} = {2}", a, b, result);
}
catch (DivideByZeroException)
{
Console.WriteLine("Attempted divide by zero.");
}
}
}
Übersicht über Ausnahmen
Ausnahmen weisen folgende Eigenschaften auf:
- Bei Ausnahmen handelt es sich um Typen, die alle letztlich von
System.Exception
abgeleitet werden. - Verwenden Sie einen
try
-Block um die Anweisungen, die möglicherweise Ausnahmen auslösen. - Sobald eine Ausnahme im
try
-Block auftritt, springt der Steuerungsfluss zum ersten zugeordneten Ausnahmehandler, der sich an einer beliebigen Stelle in der Aufrufliste befindet. In C# wird das Schlüsselwortcatch
zum Definieren eines Ausnahmehandlers verwendet. - Wenn für eine bestimmte Ausnahme kein Ausnahmehandler vorhanden ist, beendet das Programm die Ausführung mit einer Fehlermeldung.
- Fangen Sie Ausnahmen nur dann ab, wenn Sie sie behandeln und die Anwendung in einem bekannten Zustand belassen können. Wenn Sie
System.Exception
abfangen, lösen Sie diese mithilfe des Schlüsselwortsthrow
am Ende descatch
-Blocks erneut aus. - Wenn ein
catch
-Block eine Ausnahmevariable definiert, können Sie diese verwenden, um weitere Informationen zum Typ der aufgetretenen Ausnahme abzurufen. - Ausnahmen können von einem Programm mithilfe des Schlüsselworts
throw
explizit generiert werden. - Ausnahmeobjekte enthalten detaillierte Informationen über den Fehler, z.B. den Zustand der Aufrufliste und eine Textbeschreibung des Fehlers.
- Code in einem
finally
-Block wird unabhängig davon ausgeführt, ob eine Ausnahme ausgelöst wurde. Verwenden Sie einenfinally
-Block, um Ressourcen freizugeben, beispielsweise um Streams oder Dateien zu schließen, die imtry
-Block geöffnet wurden. - Zusätzlich zum strukturierten Win32-Mechanismus zur Ausnahmebehandlung wurden in .NET verwaltete Ausnahmen implementiert. Weitere Informationen finden Sie unter Structured Exception Handling (C/C++) (Strukturierte Ausnahmebehandlung [C/C++]) und A Crash Course on the Depths of Win32 Structured Exception Handling (Schnellkurs zu den Details der strukturierten Win32-Ausnahmebehandlung).
C#-Programmiersprachenspezifikation
Weitere Informationen erhalten Sie unter Ausnahmen in der C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.