Freigeben über


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 dem Debugger mitteilen, welche Ausnahmen oder Gruppen von Ausnahmen unterbrochen werden sollen, und an welchem Punkt der Debugger unterbrochen werden soll (d. a. im Debugger anhalten). 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 . Die Ausführung kann in den folgenden Fällen abgebrochen werden, wenn:

  • Eine Ausnahme wird ausgelöst, die nicht behandelt wird.
  • Der Debugger ist so konfiguriert, dass die Ausführung unterbrochen wird, bevor ein Handler aufgerufen wird.
  • Sie haben Just My Code festgelegt, und der Debugger ist so konfiguriert, dass er bei einer Ausnahme anhält, die im Benutzercode nicht 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.

Anweisen des Debuggers, wenn eine Ausnahme ausgelöst wird, zu unterbrechen

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" (Windows-Ausnahmeeinstellungendebuggen >>) den Knoten für eine Kategorie von Ausnahmen, z. B. Common Language Runtime Exceptions. 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 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 Zeile wird jedoch nicht angezeigt here .

  • 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 AccessViolationException in den Ausnahmeeinstellungen aktiviert ist, wird die Ausführung sowohl in der throw Zeile 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

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 Spaltenbeschriftung klicken und dann "Spalten zusätzliche Aktionen anzeigen" >auswählen. (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 Weiter bei unbehandeltem Benutzercode in dieser Spalte anzeigt, setzt der Debugger die Ausführung fort, wenn diese Ausnahme nicht im Benutzercode, aber 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

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 ruft der Benutzercode String.Format() auf, der eine FormatException auslöst. Ausführungsunterbrechungen wie folgt:

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 die gleiche Auswirkung wie das Deaktivieren der Ausnahme, d. h., dass der Debugger nicht anhält, wenn sie 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

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

    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 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 auch wählen, Störungen bei bestimmten Modulen zu 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.

  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 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.