Visual Studio hatte früher ein bestimmtes Kontrollkästchen für "Bei nicht behandelter Ausnahme unterbrechen". Im Jahr 2015 wurde dies entfernt (oder an einen Ort verschoben, den ich nicht finden kann). Jetzt werden meine konvertierten Projekte nicht mehr unterbrochen, wenn ich keinen Ausnahmebehandler auf Benutzerebene bereitstellen kann. Ich möchte nicht alle "ausgelösten Ausnahmen" brechen, weil ich bestimmte behandle. Genau dort, wo ich keinen bestimmten Handler zur Verfügung stelle.
Im Moment verlässt mein Code einfach die aktuelle Prozedur und setzt die Ausführung am nächsten Speicherort des Aufrufstapels fort, NICHT GUT.
Weiß jemand, wie man dies in Visual Studio 2015 zurückbekommt? Ich habe gestern gerade ein Upgrade auf die Community Edition durchgeführt.
Tool
oder nichtWindow
alle gewünschten Speicherorte vorhanden sind. In Ihrem Fall suchen Sie nach Ausnahmeeinstellungen .Antworten:
Es gibt ein neues Fenster mit dem Namen "Ausnahmeeinstellungen", das standardmäßig im unteren rechten Bereich angezeigt wird, wenn Sie mit dem Debuggen beginnen. Es hat alle Optionen, die Sie erwarten würden.
Sie können es mit CTRL+ ALT+ aufrufenE
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. Die 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 im neuen Fenster mit den Ausnahmeeinstellungen mit der rechten Maustaste auf die Spaltenüberschrift (Break When Thrown) klicken und die Spalte "Additional Actions" hinzufügen, in der Sie jede Ausnahme als "Continue" festlegen können, wenn sie im Benutzercode nicht behandelt wird.
Klicken Sie einfach mit der rechten Maustaste auf eine Ausnahme oder eine gesamte Gruppe und deaktivieren Sie das Flag "Weiter, wenn im Benutzercode nicht behandelt". Leider wird die Spalte "Zusätzliche Aktionen" leer angezeigt. Dies entspricht "Pause, wenn im Benutzercode nicht behandelt".
Mehr dazu hier:
http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx
quelle
Ich hatte das gleiche Problem und es gelang mir, dieses Problem zu lösen -
Das ist es!
Dieser Beitrag hat mich inspiriert, da ich eine x64-Version von Windows verwende .
quelle
System.ArgumentException
behandelt wird, und Zeiten, in denen dies nicht der Fall ist. Ich kümmere mich nur darum zu brechen, wenn es nicht gehandhabt wird.Für Googler, die nur dann brechen möchten, wenn die Ausnahme ihren Code betrifft, gibt es in Visual Studio 2015 eine Option: Optionen-> Debugging-> Allgemein-> Nur mein Code. Nach der Überprüfung kann nicht unterbrochen werden, wenn die Ausnahme außerhalb Ihres Codes verwaltet (ausgelöst und abgefangen) wird.
quelle
Microsoft hat die Logik im neuen Ausnahmefenster geringfügig 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üsselteil ist:
Aber wenn Sie wie ich, Sie haben globale Unhandled Exception Handler in Ihrem Code dann der zweite Punkt auf dieser Liste ist der Schlüssel: Für mich ist daher keine Ausnahmen wirklich nicht behandeltes werden, die von VS2013 , anders zu sein scheint.
Um das Verhalten wiederherzustellen, bei dem VS bei nicht behandelten Ausnahmen bricht, musste ich alle Ausnahmetypen ankreuzen, bei denen ich brechen wollte, und zweitens sicherstellen, dass die "zusätzlichen Optionen" (möglicherweise müssen Sie diese Spalte sichtbar machen *) für "Weiter" wenn im Benutzercode nicht behandelt "wurde NICHT gesetzt. Die VS2015 Logik nicht scheinen , um meine zu betrachten Globale Unbehandelte Exception Handler „in Benutzercode behandelt“ werden, so dass sie brechen auf diese tut; es bricht jedoch nicht bei gefangenen Ausnahmen. Dadurch funktioniert es wie VS2013.
* So aktivieren Sie die Spalte "Zusätzliche Aktionen"
quelle
Wenn ich hier richtig zwischen den Zeilen lese, besteht das Problem darin, dass Ihre Ausnahme effektiv "verschwindet", obwohl das Standardverhalten des Debuggers bei nicht behandelten Ausnahmen unterbrochen werden sollte.
Wenn Sie über asynchrone Methoden verfügen, tritt dieses Problem möglicherweise auf, da Ausnahmen, die nicht als Teil einer Task-Fortsetzung in einem Thread-Pool-Thread abgefangen wurden, nicht als nicht behandelte Ausnahmen gelten. Sie werden vielmehr verschluckt und mit der Aufgabe gespeichert.
Schauen Sie sich zum Beispiel diesen Code an:
Wenn Sie dieses Programm mit den Standard-Debugger-Einstellungen ausführen (nur bei nicht behandelten Ausnahmen stoppen), wird der Debugger nicht unterbrochen. Dies liegt daran, dass der der Fortsetzung zugewiesene Thread-Pool-Thread die Ausnahme verschluckt (an die Task-Instanz weitergibt) und sich wieder an den Pool freigibt.
Beachten Sie, dass in diesem Fall das eigentliche Problem darin besteht, dass die
Task
Rückgabe vonTest()
niemals überprüft wird. Wenn Ihr Code ähnliche Arten von "Feuer-und-Vergessen" -Logik enthält, werden die Ausnahmen zum Zeitpunkt des Auslösens nicht angezeigt (selbst wenn sie innerhalb der Methode "nicht behandelt" werden). Die Ausnahme wird nur angezeigt, wenn Sie die Aufgabe beobachten, indem Sie auf sie warten, ihr Ergebnis überprüfen oder ihre Ausnahme explizit betrachten.Dies ist nur eine Vermutung, aber ich denke, es ist wahrscheinlich, dass Sie so etwas beobachten.
quelle
Debugger.Break()
Aufruf hinzufügen . Alternativ können SieDebugger.Break()
demTaskScheduler.UnobservedTaskException
Handler ein explizites Element hinzufügen. Der Nachteil hierbei ist jedoch, dass dies viel später als die ursprüngliche Ausnahme ausgelöst werden kann, wie dies beim Finalizer-Thread der Fall ist, wenn die Aufgabe bereinigt wird. Im Allgemeinen sollten Sie sich bemühen, die Aufgabenergebnisse immer zu beobachten oder zumindest einen Try-Catch-Block zum Protokollieren zum Zeitpunkt des Fehlers zu haben.Nach meiner Erfahrung werden die Ausnahmeeinstellungen im Jahr 2015 völlig aus dem Ruder gelaufen, wenn Sie etwas ändern.
Erwarten Sie, dass, wenn Sie bis zur übergeordneten Gruppe "CLR", Sie keine brechende Execpt für nicht behandelt bekommen sollten. Sie werden immer brechen, wenn eine Ausnahme nicht behandelt wird. Wenn Sie jedoch die CLR-Gruppe deaktiviert haben, sollte 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 scheiß nicht drauf.
quelle
Befolgen Sie die Anweisungen:
https://msdn.microsoft.com/en-us/library/x85tt0dd.aspx
quelle
try { task.Wait(); } catch { ... }
) und OperationCanceledException in der Aufgabe wurde im Benutzercode irgendwie als nicht behandelt betrachtet.Es ist alles ein bisschen verwirrend und meiner Meinung nach nicht so gut wie der alte Ausnahmedialog, aber trotzdem.
Wenn eine Ausnahme in der Liste enthalten ist und angekreuzt ist, wird der Debugger bei jedem Auslösen der Ausnahme unterbrochen.
Wenn eine Ausnahme deaktiviert ist oder nicht in der Liste enthalten ist, wird der Debugger nur dann unterbrochen, wenn dieser Ausnahmetyp vom Benutzer nicht behandelt wird.
Im folgenden Screenshot wird der Debugger beispielsweise bei jedem
System.AccessViolationException
Auslösen von a unterbrochen, bei allen anderen Ausnahmen jedoch nur, wenn die Ausnahme vom Benutzer nicht behandelt wurde.quelle
Beim Upgrade auf VS2015 gab es auch Probleme, bei denen Ausnahmen zum "Brechen" der Anwendung verwendet wurden, jetzt jedoch ignoriert und sofort übergeben werden. Es gibt Zeiten, in denen unser Code absichtlich Ausnahmen an Stellen auslösen soll , an denen der Code gestoppt werden soll, anstatt fortzufahren. Wir verwenden immer den Ausdruck
Throw New Exception("Message")
, um unseren Code absichtlich zu brechen:Bei VS2015 wird die klassische "System.Exception" ausgelöst, wenn wir sagen
Throw New Exception
. Daher mussten wir das Häkchen "System.Exception" in den neuen Ausnahmeeinstellungen aktivieren:Aktivieren Sie das Kontrollkästchen System.Exception
Nach der Überprüfung hat unser Code wie erwartet funktioniert.
quelle
Die Lösung besteht darin, dass dies semantisch das Gegenteil von dem ist, was Sie zu setzen glauben. Sie müssen sicherstellen , dass , wenn in Benutzercode nicht behandelte Weiter ist nicht aktiviert , dh nicht überprüft , wie gezeigt unter der weiteren Aktionen Spalte in dem Exception - Einstellungen Registerkarte - siehe unten:
Sie sagen effektiv, dass Sie nicht fortfahren (dh brechen), wenn Sie im Code nicht behandelt werden
Um dies zu tun:
Das hat es für mich getan - wieder glücklich.
Dies war in VS 2015
quelle
Es gibt definitiv einen Fehler in Visual Studio, der dazu führen kann, dass es stecken bleibt und einen Neustart erfordert. Sogar VS2015.
Ich hatte eine Single-Threaded-Situation, in der ein
NullReferenceException
von einem 'äußeren' Handler (immer noch in meinem Code) abgefangen wurde, obwohl ich darum gebeten hatte, dass es beim Auslösen kaputt geht.Mir ist klar, dass dies eine "behandelte" Ausnahme ist und Sie von einer "nicht behandelten" Ausnahme sprechen. Ich bin mir jedoch ziemlich sicher, dass manchmal ein schneller Neustart von VS dies behebt, wenn IISRESET dies nicht tut.
quelle
Visual Studio 2017 funktioniert einwandfrei mit der Fehlerbehandlung. Visual Studio 2015 hingegen nervt bei der Fehlerbehandlung bei Aufgaben, da im Debug-Modus alle Ausnahmen, die in einer asynchronen Aufgabe auftreten, abgefangen werden, aber wenn ich darüber gehe, hängt es einfach auf unbestimmte Zeit. Wenn es ohne Debugging ausgeführt wird, hängt es ohne Ausnahme auf unbestimmte Zeit !!! Ich liebe Visual Studio und benutze es seit 1995 und 2015 ist mit Abstand die schlechtere Version, obwohl ich von 2010 direkt auf 2015 gesprungen bin. Ich habe 8 Stunden lang versucht, diese Ausnahmebehandlung ohne Erfolg zum Laufen zu bringen. Ich habe den genauen Code bis 2017 auf meinen Heimcomputer kopiert und es hat perfekt funktioniert. Ich bin sehr irritiert darüber, dass Microsoft Aufgaben in ein Framework verschoben hat, das der Compiler 2015 nicht richtig verarbeiten kann.
quelle