Verwalten von Ausnahmen mit dem Debugger in Visual Studio

Eine Ausnahme ist ein Hinweis auf einen Fehlerstatus, der auftritt, während ein Programm ausgeführt wird. Sie können den Debugger informieren, bei welchen Ausnahmen oder Gruppen von Ausnahmen eine Unterbrechung erforderlich erfolgen soll und an welchem Punkt der Debugger eine Unterbrechung vornehmen soll (d.h. Pause im Debugger). Wenn der Debugger stoppt, zeigt er Ihnen, wo die Ausnahme ausgelöst wurde. Sie können auch Ausnahmen hinzufügen oder löschen. Wenn eine Lösung in Visual Studio geöffnet ist, verwenden Sie "Windows-Ausnahmeeinstellungen debuggen >>", um das Fenster "Ausnahmeeinstellungen" zu öffnen.

Stellen Sie Handler bereit, die auf die wichtigsten Ausnahmen reagieren. Wenn Sie wissen müssen, wie Sie Handler für Ausnahmen hinzufügen können, lesen Sie "Beheben von Fehlern", indem Sie besseren C#-Code schreiben. Außerdem erfahren Sie, wie Sie den Debugger so konfigurieren, dass die Ausführung für einige Ausnahmen immer abgebrochen wird.

Wenn eine Ausnahme auftritt, schreibt der Debugger eine Ausnahmemeldung in das Ausgabefenster . In den folgenden Fällen kann die Ausführung unterbrochen werden:

  • Es wird eine Ausnahme ausgelöst, die nicht behandelt wird.
  • Der Debugger ist so konfiguriert, dass die Ausführung unterbrochen wird, bevor ein Handler aufgerufen wird.
  • Wenn Sie Nur eigenen Code festgelegt haben und der Debugger so konfiguriert ist, dass eine Unterbrechung bei jeder Ausnahme veranlasst wird, die nicht im Benutzercode behandelt wird.

Hinweis

ASP.NET verfügt über einen Ausnahmehandler auf oberster Ebene, der Fehlerseiten in einem Browser anzeigt. Die Ausführung wird nicht abgebrochen, es sei denn "Just My Code" ist aktiviert. Ein Beispiel finden Sie unter Anweisung an den Debugger, bei benutzerbedingt nicht behandelten Ausnahmen fortzufahren weiter unten.

Hinweis

In einer Visual Basic-Anwendung verwaltet der Debugger alle Fehler als Ausnahmen, auch wenn Sie On Error-Fehlerbehandler verwenden.

Festlegen, dass der Debugger die Ausführung bei ausgelöster Ausnahme unterbricht

Der Debugger kann die Ausführung an dem Punkt unterbrechen, an dem eine Ausnahme ausgelöst wird. Daher können Sie die Ausnahme untersuchen, bevor ein Handler aufgerufen wird.

Erweitern Sie im Fenster Ausnahmeeinstellungen (Debuggen > Windows > Ausnahmeeinstellungen) den Knoten für eine Kategorie von Ausnahmen, z. B.CLR-Ausnahmen. Aktivieren Sie dann das Kontrollkästchen für eine bestimmte Ausnahme innerhalb dieser Kategorie, z. B. System.AccessViolationException. Sie können auch eine gesamte Kategorie von Ausnahmen auswählen.

Screenshot des Dialogfelds

Screenshot des Kontrollkästchens

Tipp

Sie können bestimmte Ausnahmen mithilfe des Suchfensters in der Symbolleiste "Ausnahmeeinstellungen " finden oder die Suche verwenden, um nach bestimmten Namespaces (z. B. System.IO) zu filtern.

Wenn Sie im Fenster "Ausnahmeeinstellungen " eine Ausnahme auswählen, wird die Debuggerausführung unabhängig davon, wo die Ausnahme ausgelöst wird, abgebrochen, unabhängig davon, ob sie behandelt wird. Die Ausnahme wird nun als erste Zufalls ausnahme bezeichnet. Hier sind z. B. einige Szenarien:

  • In der folgenden C#-Konsolenanwendung löst die Main-Methode eine AccessViolationException innerhalb eines try/catch Blocks aus.

    static void Main(string[] args)
    {
        try
        {
            throw new AccessViolationException();
            Console.WriteLine("here");
        }
        catch (Exception e)
        {
            Console.WriteLine("caught exception");
        }
        Console.WriteLine("goodbye");
    }
    

    Wenn AccessViolationException in den Ausnahmeeinstellungen aktiviert ist, wird die Ausführung in der throw Zeile unterbrochen, wenn Sie diesen Code im Debugger ausführen. Anschließend können Sie die Ausführung fortsetzen. Die Konsole sollte beide Linien anzeigen:

    caught exception
    goodbye
    

    Die here-Zeile wird jedoch nicht angezeigt.

  • Eine C#-Konsolenanwendung verweist auf eine Klassenbibliothek mit einer Klasse mit zwei Methoden. Eine Methode löst eine Ausnahme aus und behandelt sie, während eine zweite Methode dieselbe Ausnahme auslöst, sie aber nicht behandelt.

    public class Class1
    {
        public void ThrowHandledException()
        {
            try
            {
                throw new AccessViolationException();
            }
            catch (AccessViolationException ave)
            {
                Console.WriteLine("caught exception" + ave.Message);
            }
        }
    
        public void ThrowUnhandledException()
        {
            throw new AccessViolationException();
        }
    }
    

    Dies ist die Main()-Methode der Konsolenanwendung:

    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
        class1.ThrowHandledException();
        class1.ThrowUnhandledException();
    }
    

    Wenn Sie AccessViolationException in den Ausnahmeeinstellungen aktiviert haben, wird die Ausführung an der throw-Zeile sowohl in ThrowHandledException() als auch in ThrowUnhandledException() unterbrochen, wenn Sie diesen Code im Debugger ausführen.

Um die Ausnahmeeinstellungen auf die Standardeinstellungen zurückzusetzen, wählen Sie die Schaltfläche Liste auf die Standardeinstellungen zurücksetzen aus.

Screenshot der Schaltfläche

Screenshot zum Wiederherstellen der Standardeinstellungen in den Ausnahmeeinstellungen

Weisen Sie den Debugger an, bei vom Benutzer nicht behandelten Ausnahmen fortzufahren.

Wenn Sie .NET- oder JavaScript-Code mit Just My Code debuggen, können Sie den Debugger anweisen, das Unterbrechen von Ausnahmen zu verhindern, die nicht im Benutzercode behandelt werden, aber an anderer Stelle behandelt werden.

  1. Öffnen Sie im Fenster Ausnahmeeinstellungen das Kontextmenü, indem Sie mit der rechten Maustaste auf eine Spaltenbezeichnung klicken, und wählen Sie dann Spalten anzeigen > Weitere Aktionen aus. (Wenn Sie just My Code deaktiviert haben, wird dieser Befehl nicht angezeigt.) Eine dritte Spalte mit dem Namen "Zusätzliche Aktionen " wird angezeigt.

    Screenshot der Spalte

    Für eine Ausnahme, die Fortfahren, wenn in Benutzercode nicht behandelt in dieser Spalte anzeigt, wird der Debugger fortgesetzt, wenn diese Ausnahme nicht im Benutzercode, sondern extern behandelt wird.

  2. Wenn Sie diese Einstellung für eine bestimmte Ausnahme ändern möchten, wählen Sie die Ausnahme aus, klicken Sie mit der rechten Maustaste, um das Kontextmenü anzuzeigen, und wählen Sie "Weiter bei nicht behandelten Ausnahmen im Benutzer-Code" aus. Sie können auch die Einstellung für eine gesamte Kategorie von Ausnahmen ändern, z. B. die gesamten Common Language Runtime-Ausnahmen).

    Screenshot der Einstellung „Fortfahren, wenn in Benutzercode nicht behandelt“

Beispielsweise behandeln ASP.NET Webanwendungen Ausnahmen, indem sie in einen HTTP 500-Statuscode (Ausnahmebehandlung in ASP.NET Web-API) konvertiert werden, was Ihnen möglicherweise nicht helfen kann, die Quelle der Ausnahme zu ermitteln. Im folgenden Beispiel wird durch den Benutzercode String.Format() aufgerufen, wodurch eine FormatExceptionausgelöst wird. Ausführungsunterbrechungen wie folgt:

Screenshot, der eine System.FormatException zeigt.

Unterbrechungen bei vom Benutzer nicht behandelten Ausnahmen

Hinzufügen und Löschen von Ausnahmen

Sie können Ausnahmen hinzufügen und löschen. Wenn Sie einen Ausnahmetyp aus einer Kategorie löschen möchten, wählen Sie die Ausnahme aus, und wählen Sie auf der Symbolleiste "Ausnahmeeinstellungen" die ausgewählte Ausnahme aus der Listenschaltfläche (minuszeichen) aus. Oder Sie können mit der rechten Maustaste auf die Ausnahme klicken und im Kontextmenü "Löschen" auswählen. Das Löschen einer Ausnahme hat dieselbe Wirkung wie das Deaktivieren, d. h. der Debugger wird nicht unterbrochen, wenn die Ausnahme ausgelöst wird.

So fügen Sie eine Ausnahme hinzu:

  1. Wählen Sie im Fenster "Ausnahmeeinstellungen " eine der Ausnahmekategorien aus (z. B. Common Language Runtime).

  2. Wählen Sie die Schaltfläche 'Ausnahme zur ausgewählten Kategorie hinzufügen' (Pluszeichen).

    Screenshot der Schaltfläche

    Screenshot der Schaltfläche

  3. Geben Sie den Namen der Ausnahme ein (z. B . System.UriTemplateMatchException).

    Screenshot, der den Ausnahmenamen zeigt.

    Screenshot des Ausnahmentypnamens.

    Die Ausnahme wird der Liste (in alphabetischer Reihenfolge) hinzugefügt und automatisch überprüft.

Wenn Sie eine Ausnahme zu den GPU-Speicherzugriffs-Ausnahmen; JavaScript-Runtime-Ausnahmen; oder Win32-Ausnahmkategorien hinzufügen möchten, schließen Sie den Fehlercode und die Beschreibung ein.

Tipp

Überprüfen Sie Ihre Rechtschreibung! Das Fenster "Ausnahmeeinstellungen " überprüft nicht, ob eine hinzugefügte Ausnahme vorhanden ist. Wenn Sie Sytem.UriTemplateMatchException also eingeben, erhalten Sie einen Eintrag für diese Ausnahme (und nicht für System.UriTemplateMatchException).

Ausnahmeeinstellungen werden in der SUO-Datei der Lösung beibehalten, sodass sie auf eine bestimmte Lösung angewendet werden. Sie können bestimmte Ausnahmeeinstellungen nicht für lösungen hinweg wiederverwenden. Jetzt werden nur hinzugefügte Ausnahmen gespeichert; gelöschte Ausnahmen werden nicht beibehalten. Sie können eine Ausnahme hinzufügen, die Lösung schließen und erneut öffnen, und die Ausnahme ist weiterhin vorhanden. Wenn Sie jedoch eine Ausnahme löschen und die Lösung schließen/erneut öffnen, wird die Ausnahme wieder angezeigt.

Das Fenster "Ausnahmeeinstellungen " unterstützt generische Ausnahmetypen in C#, aber nicht in Visual Basic. Um Ausnahmen wie MyNamespace.GenericException<T>zu unterbrechen, müssen Sie die Ausnahme als MyNamespace.GenericException'1 hinzufügen. Das heißt, wenn Sie eine Ausnahme wie diesen Code erstellt haben:

public class GenericException<T> : Exception
{
    public GenericException() : base("This is a generic exception.")
    {
    }
}

Mit dem vorherigen Verfahren können Sie die Ausnahme zu den Ausnahmeeinstellungen hinzufügen:

Screenshot, der zeigt, wie eine generische Ausnahme hinzugefügt wird.

Screenshot der Funktion 'Generische Ausnahme hinzufügen'.

Hinzufügen von Bedingungen zu einer Ausnahme

Verwenden Sie das Fenster "Ausnahmeeinstellungen" , um Bedingungen für Ausnahmen festzulegen. Derzeit unterstützte Bedingungen umfassen die Modulnamen, die für die Ausnahme eingeschlossen oder ausgeschlossen werden sollen. Indem Sie Modulnamen als Bedingungen festlegen, können Sie festlegen, dass die Ausnahme nur für bestimmte Codemodule abgebrochen werden soll. Sie können eine Unterbrechung für bestimmte Module auch vermeiden.

Hinweis

Das Hinzufügen von Bedingungen zu einer Ausnahme wird ab Visual Studio 2017 unterstützt.

So fügen Sie bedingte Ausnahmen hinzu:

  1. Wählen Sie im Fenster "Ausnahmeeinstellungen" die Schaltfläche " Bedingungen bearbeiten " aus, oder klicken Sie mit der rechten Maustaste auf die Ausnahme, und wählen Sie "Bedingungen bearbeiten" aus.

    Screenshot der Ausnahmebedingungen.

    Screenshot der Ausnahmebedingungen.

  2. Wenn Sie der Ausnahme zusätzliche erforderliche Bedingungen hinzufügen möchten, wählen Sie "Bedingung hinzufügen " für jede neue Bedingung aus. Zusätzliche Bedingungslinien werden angezeigt.

    Screenshot mit zusätzlichen Bedingungen für eine Ausnahme.

    Screenshot der zusätzlichen Bedingungen für eine Ausnahme.

  3. Geben Sie für jede Bedingungszeile den Namen des Moduls ein, und ändern Sie die Vergleichsoperatorliste in "Gleich" oder "Nicht gleich". Sie können Platzhalter (\*) im Namen angeben, um mehr als ein Modul zu spezifizieren.

  4. Wenn Sie eine Bedingung löschen müssen, wählen Sie das X am Ende der Bedingungszeile aus.