Übersicht über Ausnahmen

Aktualisiert: November 2007

Bei einer Ausnahme handelt es sich um einen Fehlerzustand oder unerwartetes Verhalten beim Ausführen eines Programms. Ausnahmen können durch Fehler im eigenen oder aufgerufenen Code (z. B. bei gemeinsam genutzten Bibliotheken), nicht verfügbare Betriebssystemressourcen, unerwartete, von der CLR (Common Language Runtime) festgestellte Fehlerzustände (z. B. durch nicht überprüfbaren Code) und anderen Ereignissen ausgelöst werden. Anwendungen können in einigen, aber nicht allen Fällen wiederhergestellt werden. Bei den meisten Anwendungsausnahmen ist eine Wiederherstellung möglich, bei den meisten Laufzeitausnahmen ist dies jedoch nicht der Fall.

In .NET Framework stellt eine Ausnahme ein Objekt dar, das von der Exception-Klasse erbt. Eine Ausnahme wird in einem Codebereich ausgelöst, in dem ein Fehler aufgetreten ist. Die Ausnahme bleibt solange im Stapel, bis sie durch die Anwendung behandelt oder das Programm beendet wird. Weitere Informationen über Ausnahmebehandlungen in .NET Framework finden Sie im Thema Exception-Klasse.

Verwalten von Ausnahmen durch die Common Language Runtime

Die Common Language Runtime verwendet ein auf Ausnahmeobjekten und geschützten Codeblöcken basierendes Modell der Ausnahmebehandlung. Ein Exception-Objekt wird zur Darstellung einer auftretenden Ausnahme erstellt.

Durch die Common Language Runtime wird eine Tabelle mit Ausnahmeinformationen für jede ausführbare Datei erstellt. Jeder Methode einer ausführbaren Datei wird in dieser Tabelle ein (ggf. leeres) Array mit Informationen zur Ausnahmebehandlung zugeordnet. Jeder Eintrag in diesem Array beschreibt einen geschützten Codeblock, alle mit diesem Code verknüpften Ausnahmefilter und alle Ausnahmehandler (catch-Anweisungen). Die Ausnahmetabelle ist sehr effizient. Werden keine Ausnahmen ausgelöst, gibt es keine Leistungseinbußen bei der Prozessorzeit oder Speichernutzung. Nur bei Auftreten einer Ausnahme werden Systemressourcen in Anspruch genommen.

Die Ausnahmetabelle enthält vier Typen von Ausnahmehandlern für geschützte Blöcke:

  • Der finally-Handler wird immer ausgeführt, wenn der Block durch die normale Ablaufsteuerung oder eine unbehandelte Ausnahme beendet wird.

  • Der fault-Handler wird immer beim Auftreten einer Ausnahme ausgeführt, aber nicht nach Abschluss der normalen Ablaufsteuerung.

  • Der typgefilterte Handler behandelt alle Ausnahmen einer angegebenen Klasse oder einer davon abgeleiteten Klasse.

  • Der benutzergefilterte Handler führt benutzerdefinierten Code aus, um zu entscheiden, ob die Ausnahme vom zugeordneten Handler behandelt oder dem nächsten geschützten Block übergeben wird.

Jede Sprache implementiert diese Ausnahmehandler entsprechend ihrer Spezifikationen. Zum Beispiel bietet Visual Basic 2005 Zugriff auf den benutzergefilterten Handler über einen Variablenvergleich in der catch-Anweisung (mit dem When-Schlüsselwort). In C# dagegen kann dieser Handler nicht implementiert werden.

Tritt eine Ausnahme auf, führt die Common Language Runtime die beiden folgenden Schritte durch:

  1. Durchsuchen des Arrays nach dem ersten geschützten Block, der

    • einen die gerade ausgeführte Anweisung enthaltenden Bereich schützt und

    • einen Ausnahmehandler oder einen Filter zur Ausnahmebehandlung enthält.

  2. Im Fall der Übereinstimmungen Erstellen eines Exception-Objekts, das die Ausnahme beschreibt. Daraufhin werden alle finally- oder fault-Anweisungen zwischen der Anweisung, bei der die Ausnahme auftrat, und derjenigen, die sie behandelt, ausgeführt. Beachten Sie, dass die Reihenfolge der Ausnahmehandler wichtig ist: Der innerste Ausnahmehandler wird zuerst ausgewertet. Beachten Sie außerdem, dass Ausnahmehandler auf lokale Variablen und lokalen Arbeitsspeicher der Routine zugreifen können, durch die die Ausnahme abgefangen wurde, aber alle Zwischenwerte zum Zeitpunkt des Auslösens der Ausnahme verloren gehen.

    Enthält die aktuelle Methode keine Übereinstimmungen, durchsucht die Common Language Runtime jeden Aufrufer der aktuellen Methode und verfährt so weiter für den ganzen Stapel. Gibt es bei keinem Aufrufer eine Übereinstimmung, wird dem Debugger der Zugriff auf die Ausnahme gestattet. Wenn die Ausnahme durch den Debugger nicht behandelt wird, löst die CLR das UnhandledException-Ereignis aus. Sind keine Listener für das UnhandledException-Ereignis zu finden, gibt die CLR eine Stapelüberwachung aus und beendet das Programm.

Filtern von Laufzeitausnahmen

Sie können die abgefangenen Ausnahmen filtern und entweder nach Typ oder nach benutzerdefinierten Kriterien behandeln.

Typgefilterte Handler behandeln einen bestimmten Ausnahmetyp (oder davon abgeleitete Klassen). Bei der am häufigsten verwendeten Form eines solchen Handlers wird festgelegt, dass nur eine bestimmte Ausnahmeklasse abgefangen wird.

Das folgende Beispiel zeigt einen Ausnahmehandler, der eine ganz bestimmte Ausnahme abfangen soll, in diesem Fall die FileNotFoundException.

Catch e As FileNotFoundException
   Console.WriteLine("[Data File Missing] {0}", e)
catch(FileNotFoundException e) {
    Console.WriteLine("[Data File Missing] {0}", e);
}

Benutzergefilterte Handler fangen und behandeln Ausnahmen gemäß benutzerdefinierten Ausnahmebedingungen. Diese Handler verwenden die Catch-Anweisung mit dem When-Schlüsselwort in Visual Basic 2005. Einzelheiten zum Filtern von Ausnahmen auf diese Weise finden Sie unter Verwenden spezifischer Ausnahmen in einem Catch-Block.

Siehe auch

Konzepte

Exception-Klasse und Exception-Eigenschaften

Ausnahmenhierarchie

Empfohlene Vorgehensweise für die Ausnahmebehandlung

Weitere Ressourcen

Grundlagen der Ausnahmebehandlung

Behandeln und Auslösen von Ausnahmen