web-dev-qa-db-ger.com

Visual Studio 2015-Fehler bei nicht behandelten Ausnahmen, die nicht funktionieren

In Visual Studio gab es ein spezielles Kontrollkästchen für "Unterbrechung bei nicht behandelter Ausnahme". 2015 wurde diese entfernt (oder an einen anderen Ort verschoben, wo ich sie nicht finden kann). Daher sind meine konvertierten Projekte jetzt nicht mehr fehlerfrei, wenn ich keinen Ausnahmehandler auf Benutzerebene bereitstellen kann. Ich möchte nicht an allen "geworfenen Ausnahmen" brechen, weil ich mit bestimmten Ausnahmen umgehe. Nur wo ich keinen spezifischen Handler zur Verfügung stellen kann. 

Im Moment verlässt mein Code einfach die aktuelle Prozedur und setzt die Ausführung am nächsten Aufrufspeicherort (NICHT GUT) fort.

Weiß jemand, wie Sie dies in Visual Studio 2015 zurückbekommen? Ich habe gerade gestern auf die Community Edition aktualisiert.

110
Ted Lowery

Es gibt ein neues Fenster mit dem Namen "Ausnahmeeinstellungen", das standardmäßig unten rechts angezeigt wird, wenn Sie mit dem Debuggen beginnen. Es hat alle Optionen, die Sie erwarten würden.

Sie können es mit bringen CTRL+ALT+E

Auf diese Weise können Sie auswählen, welche Ausnahmen zu einer Unterbrechung des Debuggers führen.

Der Schlüssel ist jedoch, dass Sie auch festlegen können, ob diese Ausnahmen immer oder nur dann unterbrochen werden, wenn es sich um eine nicht behandelte Ausnahme handelt. Diese Einstellung ist jedoch nicht sehr intuitiv.

Sie müssen zuerst "Nur meinen Code aktivieren" unter Extras> Optionen> Debuggen aktivieren.

Auf diese Weise können Sie mit der rechten Maustaste auf die Spaltenüberschrift (Break When Thrown) im neuen Fenster "Exceptions Settings" klicken und die Spalte "Additional Actions" hinzufügen, in der Sie jede Ausnahme als "Continue when unhandled in user code" festlegen können.

Klicken Sie mit der rechten Maustaste auf eine Ausnahme oder eine gesamte Gruppe und deaktivieren Sie das Flag "Weiter, wenn im Benutzercode nicht verarbeitet". Leider wird die Spalte "Zusätzliche Aktionen" leer angezeigt. Dies entspricht der Spalte "Unterbrechung, wenn sie nicht im Benutzercode behandelt wird".

enter image description here

Mehr dazu hier:

http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx

114
Tom Studee

Ich hatte das gleiche Problem und es gelang mir, dieses Problem zu lösen.

  1. Drücken Sie Ctrl + Alt + e um das Fenster Exception Settings aufzurufen.
  2. Kreuzen Sie Common Language Runtime Exceptions an. enter image description here

Das ist es!

Das hat mich inspiriert post , da ich eine x64-Version von Windows verwende.

36
Justin XL

Für Googler, die nur dann brechen möchten, wenn die Ausnahme den Code betrifft, gibt es in Visual Studio 2015 eine Option: Optionen -> Debugging -> Allgemein -> Nur mein Code. Wenn diese Option aktiviert ist, kann sie nicht unterbrochen werden, wenn die Ausnahme außerhalb Ihres Codes verwaltet (ausgelöst und abgefangen) wird.

9

Microsoft hat die Logik im neuen Ausnahmefenster subtil geändert.

Siehe http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx

Der Schlüssel dazu ist:

Wichtige Notizen

  • Dieses neue Fenster enthält alle Funktionen des alten modalen Dialogfelds. Die Funktionen des Debuggers haben sich nur durch den Zugriff geändert
  • Der Debugger wird immer abgebrochen, wenn eine Ausnahme nicht behandelt wird
  • Die Einstellung, die geändert werden soll, wenn der Debugger bei vom Benutzer nicht behandelten Ausnahmen unterbrochen wird, wurde unter ein Kontextmenü verschoben
  • Der Menüpfad wurde in Debug -> Windows -> Exception Settings verschoben

Wie auch immer, wenn Sie wie ich einen Global Unhandled Exception Handler in Ihrem Code haben, ist der zweite Punkt in dieser Liste der Schlüssel: Für mich werden daher keine Ausnahmen wirklich unbehandelt sein, was scheinbar der Fall ist unterscheidet sich von VS2013.

Um das Verhalten wiederherzustellen, bei dem VS bei nicht behandelten Ausnahmen bricht, musste ich alle Ausnahmetypen markieren, bei denen ich einen Fehler unterbrechen wollte, und anschließend sicherstellen, dass die "Zusätzliche Optionen" (möglicherweise müssen Sie diese Spalte sichtbar machen) für "Weiter" Wenn im Benutzercode unbehandelt "wurde NICHT gesetzt. Die VS2015-Logik tut dies nicht scheint meinen Global Unhandled Exception Handler als "im Benutzercode behandelt" zu behandeln, daher bricht sie diese ab. es geht aber nicht um gefangene Ausnahmen. Damit funktioniert es wie VS2013.

* So aktivieren Sie die Spalte "Zusätzliche Aktionen "  *How to enable the "Additional Actions" column

9
OffHeGoes

Wenn ich hier zwischen den Zeilen richtig lese, besteht das Problem darin, dass Ihre Ausnahme tatsächlich "verschwindet", obwohl das Standardverhalten des Debuggers bei nicht behandelten Ausnahmen zerbrechen sollte.

Wenn Sie über asynchrone Methoden verfügen, wird dieses Problem möglicherweise ausgeführt, da Ausnahmen, die nicht als Teil einer Taskfortsetzung in einem Threadpool-Thread abgefangen werden, nicht als unbehandelte Ausnahmen betrachtet werden. Sie werden vielmehr mit der Aufgabe verschluckt und gespeichert.

Sehen Sie sich beispielsweise diesen Code an:

class Program
{
    static void Main(string[] args)
    {
        Test();
        Console.ReadLine();
    }

    private async static Task Test()
    {
        await Task.Delay(100);
        throw new Exception("Exception!");
    }
}

Wenn Sie dieses Programm mit den Standardeinstellungen des Debuggers ausführen (nur bei nicht behandelten Ausnahmen anhalten), wird der Debugger nicht beschädigt. Dies liegt daran, dass der Thread-Thread, der der Fortsetzung zugeordnet ist, die Ausnahme verschluckt (an die Task-Instanz weitergibt) und sich selbst in den Pool freigibt. 

Beachten Sie, dass in diesem Fall das eigentliche Problem darin besteht, dass die von Test() zurückgegebene Task niemals geprüft wird. Wenn in Ihrem Code ähnliche Arten von "Fire-and-Forget" -Logik enthalten sind, werden die Ausnahmen zu dem Zeitpunkt, zu dem sie ausgelöst werden, nicht angezeigt (auch wenn sie innerhalb der Methode "unbehandelt" sind). Die Ausnahme wird nur angezeigt, wenn Sie die Aufgabe beobachten, indem Sie darauf warten, das Ergebnis überprüfen oder die Ausnahme explizit betrachten.

Dies ist nur eine Vermutung, aber ich denke, dass Sie so etwas beobachten.

7
Dan Bryant

Nach meiner Erfahrung werden die Ausnahmebedingungen 2015 völlig aus dem Gleichgewicht geraten, wenn Sie etwas ändern. 

Erwarten Sie, dass wenn Sie bis zur übergeordneten Gruppe "CLR" sind, Sie keine brechende Ausführung für unbehandelte erhalten sollten. Sie brechen immer ab, wenn eine Ausnahme nicht behandelt wird. Wenn Sie jedoch die CLR-Gruppe deaktiviert haben, sollte der Code in einem try ... catch einfach keine Unterbrechung verursachen. Das ist nicht der Fall.

Lösung: Klicken Sie in der neuen Toolbox für Ausnahmeeinstellungen mit der rechten Maustaste und wählen Sie "Standard wiederherstellen". Taadaaaa ... Es verhält sich wieder normal. Jetzt schraub dich nicht damit.

3
Clint StLaurent

Folgen Sie den Anweisungen:

  1. Öffnen Sie im Fenster Exception Settings das Kontextmenü, indem Sie mit der rechten Maustaste in das Fenster klicken und dann Spalten anzeigen auswählen. (Wenn Sie "Nur mein Code" deaktiviert haben, wird dieser Befehl nicht angezeigt.)
  2. Sie sollten eine zweite Spalte mit dem Namen Zusätzliche Aktionen sehen. In dieser Spalte wird Fortfahren angezeigt, wenn der Benutzercode für bestimmte Ausnahmen nicht behandelt wurde. Dies bedeutet, dass der Debugger nicht beschädigt wird, wenn diese Ausnahme nicht im Benutzercode, sondern im externen Code behandelt wird.
  3. Sie können diese Einstellung entweder für eine bestimmte Ausnahme ändern (wählen Sie die Ausnahme aus, klicken Sie mit der rechten Maustaste und wählen Sie "Fortfahren, wenn nicht in Benutzercode behandelt") oder für eine ganze Kategorie von Ausnahmen (beispielsweise alle Common Language Runtime-Ausnahmen).

https://msdn.Microsoft.com/de-de/library/x85tt0dd.aspx

1
Andrei

Es ist alles etwas verwirrend und meiner Meinung nach nicht so gut wie der alte Ausnahmedialog, aber trotzdem.

Wenn eine Ausnahme in der Liste ist und ein Häkchen gesetzt hat, wird der Debugger immer dann abgebrochen, wenn die Ausnahme ausgelöst wird.

Wenn eine Ausnahme nicht markiert oder nicht in der Liste enthalten ist, wird der Debugger nur dann abgebrochen, wenn der Ausnahme-Typ vom Benutzer nicht behandelt wird.

In der Abbildung unten wird der Debugger beispielsweise immer dann abgebrochen, wenn ein System.AccessViolationException ausgelöst wird. Bei allen anderen Ausnahmen wird er nur dann abgebrochen, wenn die Ausnahme vom Benutzer nicht behandelt wurde.

 Visual studio 2015 exceptions tool window

1
cedd

Als ich auf VS2015 aufgerüstet habe, hatte ich auch Probleme, bei denen Ausnahmen verwendet wurden, um die Anwendung zu "brechen", aber jetzt ignoriert und direkt übergeben werden. Es gibt Zeiten, in denen wir möchten, dass unser Code absichtlich Ausnahmen an Stellen auslöst, an denen der Code angehalten werden soll, anstatt fortzufahren. Wir verwenden immer die Phrase Throw New Exception("Message"), um unseren Code absichtlich zu brechen:

    If SomethingReallyBad = True Then
        Throw New Exception("Something Really Bad happened and we cannot continue.")
    End If

Mit VS2015 wird das klassische "System.Exception" ausgelöst, wenn wir Throw New Exception sagen. Daher mussten wir das Häkchen "System.Exception" in den neuen Ausnahmeeinstellungen überprüfen:

Markiere das System.Exception-Feld

Nach der Überprüfung hat sich unser Code wie erwartet entwickelt.

1
J.Wyckoff

Die Lösung dafür ist semantisch das Gegenteil von dem, was Sie Ihrer Meinung nach zu setzen glauben. Sie müssen sicherstellen, dass Continue bei nicht behandeltem Benutzercode _ ​​nicht aktiviert ist, dh nicht markiert, wie in der Spalte Additional Actions in der Ausnahme) angezeigt Einstellungen Tab - siehe unten:

sie sagen effektiv fahren Sie nicht fort (d. h. brechen Sie ab), wenn der Code nicht behandelt wird

 Exception Settings window (Control+Alt+E)

Um dies zu tun:

  1. Klicken Sie mit der rechten Maustaste auf die Ausnahme oder die Gruppe von Ausnahmen, die Sie interessieren (d. H. Normalerweise die oberste Zeile "Common Language Runtime-Ausnahmen" in der Baumstruktur). 
  2. Wählen Sie die Option Fortfahren, wenn nicht in Benutzercode behandelt (siehe unten)
  3. Stellen Sie sicher, dass die Ausnahmen nicht markiert sind (siehe unten).
  4. fahren Sie mit dem Debuggen fort

 enter image description here

Das hat es für mich getan - wieder glücklich.

Dies war in VS 2015

1
Simon Sanderson

Es gibt definitiv einen Fehler in Visual Studio, der dazu führen kann, dass er nicht neu gestartet werden kann. Sogar VS2015.

Ich hatte eine Einzelfadensituation, in der eine NullReferenceException von einem "äußeren" Handler (immer noch in meinem Code) erwischt wurde, obwohl ich darum gebeten hatte zu brechen, wenn er angehoben wurde.

Ich weiß, dass dies eine "behandelte" Ausnahme ist und Sie sprechen von "unbehandelt" - allerdings bin ich ziemlich sicher, dass ein schneller Neustart von VS dies beheben kann, wenn IISRESET dies nicht tut.

0
Simon_Weaver

Visual Studio 2017 funktioniert gut mit der Fehlerbehandlung. Visual Studio 2015 hingegen ist bei der Fehlerbehandlung mit Aufgaben schlecht, weil im Debug-Modus alle Ausnahmen, die in einer asynchronen Aufgabe auftreten, abgefangen werden, aber wenn ich darüber schritt, hängt es auf unbestimmte Zeit. Wenn es ohne Debugging ausgeführt wird, bleibt es unbegrenzt hängen, ohne dass eine Ausnahme erfasst wird. Ich liebe Visual Studio und benutze es seit 1995, und 2015 ist die weitaus schlechtere Version, obwohl ich von 2010 direkt auf 2015 gesprungen bin. Ich habe 8 Stunden damit verbracht, diese Ausnahmebehandlung ohne Erfolg zum Laufen zu bringen. Ich habe den genauen Code auf meinem Heimcomputer nach 2017 kopiert, und er hat perfekt funktioniert. Ich bin sehr irritiert, dass Microsoft Aufgaben in ein Framework verschoben hat, das der Compiler 2015 nicht korrekt verarbeiten kann.

0
Moses