Freigeben über


Ausnahmen und Ausnahmebehandlung

Die Ausnahmebehandlungsfeatures der C#-Sprache helfen Ihnen bei unerwarteten oder außergewöhnlichen Situationen, die auftreten, wenn ein Programm ausgeführt wird. Bei der Ausnahmebehandlung werden die Schlüsselwörter try, catch und finally verwendet, um Aktionen auszuprobieren, die möglicherweise nicht erfolgreich sind, um Fehler zu behandeln, wenn Sie entscheiden, dass dies vernünftig ist, und anschließend Ressourcen zu bereinigen. Ausnahmen können von der Common Language Runtime (CLR), von .NET- oder Drittanbieterbibliotheken oder durch Anwendungscode generiert werden. Ausnahmen werden mithilfe des Schlüsselworts throw erstellt.

In vielen Fällen kann eine Ausnahme nicht von einer Methode ausgelöst werden, die Ihr Code direkt aufgerufen hat, sondern durch eine weitere Methode weiter unten im Aufrufstapel. Wenn eine Ausnahme ausgelöst wird, löst der CLR den Stapel ab, sucht nach einer Methode mit einem catch Block für den spezifischen Ausnahmetyp und führt den ersten solchen catch Block aus, der gefunden wird. Wenn im Aufrufstapel kein geeigneter catch Block gefunden wird, wird der Prozess beendet und dem Benutzer eine Meldung angezeigt.

In diesem Beispiel testet eine Methode die Division durch Null 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($"{a} divided by {b} = {result}");
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

Übersicht über Ausnahmen

Ausnahmen weisen die folgenden Eigenschaften auf:

  • Ausnahmen sind Typen, die sich letztendlich von System.Exception ableiten.
  • Verwenden Sie einen try-Block um die Anweisungen, die möglicherweise Ausnahmen auslösen.
  • Sobald eine Ausnahme im try Block auftritt, springt der Steuerfluss zum ersten zugeordneten Ausnahmehandler, der an einer beliebigen Stelle im Aufrufstapel vorhanden ist. In C# wird das catch Schlüsselwort verwendet, um einen Ausnahmehandler zu definieren.
  • Wenn kein Ausnahmehandler für eine bestimmte Ausnahme vorhanden ist, wird die Ausführung des Programms mit einer Fehlermeldung beendet.
  • 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 sie verwenden, um weitere Informationen zum Typ der aufgetretenen Ausnahme zu erhalten.
  • Ausnahmen können durch ein Programm mithilfe des throw Schlüsselworts explizit generiert werden.
  • Ausnahmeobjekte enthalten detaillierte Informationen zum Fehler, z. B. den Status des Aufrufstapels und eine Textbeschreibung des Fehlers.
  • Code in einem finally Block wird unabhängig davon ausgeführt, ob eine Ausnahme ausgelöst wird. Verwenden Sie einen finally Block, um Ressourcen freizugeben, z. B. um Datenströme oder Dateien zu schließen, die try im Block geöffnet wurden.
  • Verwaltete Ausnahmen in .NET werden über den strukturierten Ausnahmebehandlungsmechanismus von Win32 implementiert. Weitere Informationen finden Sie unter Strukturierte Ausnahmebehandlung (C/C++) und Ein Crash-Kurs in die Tiefen der Win32 Strukturierten Ausnahmebehandlung.

C#-Sprachspezifikation

Weitere Informationen finden Sie unter Ausnahmen in der C#-Sprachspezifikation. Die Sprachspezifikation ist die endgültige Quelle für C#-Syntax und -Verwendung.

Siehe auch