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üsselwort catch 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üsselworts throw am Ende des catch-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 einen finally-Block, um Ressourcen freizugeben, beispielsweise um Streams oder Dateien zu schließen, die im try-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#.

Siehe auch