Visual Studio 2015 wird bei nicht behandelten Ausnahmen unterbrochen, die nicht funktionieren

114

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.

Ted Lowery
quelle
Visual Studio 2015 behält das aktuelle Layout Ihrer vorherigen Version bei, falls auf der Registerkarte Tooloder nicht Windowalle gewünschten Speicherorte vorhanden sind. In Ihrem Fall suchen Sie nach Ausnahmeeinstellungen .
Greg
4
@greg, es ist nicht so, dass ich nicht weiß, wo ich das Panel finden kann. Mein Anliegen ist, dass das von mir gesuchte Verhalten nicht in diesem Bereich enthalten ist.
Ted Lowery
selbes Problem hier. In unserem Fall erwarten wir eine Ausnahmeunterbrechung, wenn bei autofac nicht alle Typen registriert sind. Mit der gleichen Lösung mit vs2013 funktioniert es, in vs2015 bekommen wir nichts. Dies ist auch ein Problem mit anderen Registrierungen und Ausnahmen von Drittanbietern (wie nservicebus). Ich frage mich, ob dies nur für Projekte der Fall ist, die in vs2013 erstellt und in vs2015 ausgeführt wurden
Choco Smith,
3
Das neue Werkzeugfenster ist wirklich scheiße.
Cedd
Laut MS Classifications of Exceptions wird der Debugger immer unterbrochen, wenn Sie eine Ausnahme behandelt haben . Möglicherweise müssen Sie die Option "Unterbrechen, wenn Ausnahmen AppDomain überqueren ..." in der Liste "Optionen -> Debuggen -> Allgemein" aktivieren.
Tsul

Antworten:

118

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

Geben Sie hier die Bildbeschreibung ein

Mehr dazu hier:

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

Tom Studee
quelle
7
Eigentlich hat dieses Fenster nur Optionen für "Pause mit geworfen". Das will ich nicht. Ich möchte "Pause, wenn nicht behandelt".
Ted Lowery
17
und das ist das problem. Es bricht NICHT. Wie oben erwähnt, wird der aktuelle Prozeduraufruf beendet (beendet) und die nächste Codezeile in der aufrufenden Prozedur wird gerade ausgeführt.
Ted Lowery
2
und ich habe "Nur mein Code" aktiviert.
Ted Lowery
19
@ TomStudee Ich habe das gleiche Problem auch. Was ich will ist "Pause wenn nicht behandelt", aber was ich bekomme ist "Pause wenn geworfen". Die Frage ist: Wie bekomme ich "Pause, wenn ich nicht behandelt werde"?
Ogggre
1
@ TomStudee Ich habe gerade einige dringend benötigte Erläuterungen hinzugefügt, da Ihnen die Schlüsseleinstellung fehlte, mit der Sie Ausnahmen festlegen können, die nur dann unterbrochen werden, wenn sie nicht behandelt werden.
Jerad Rose
36

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

  1. Drücken Sie Ctrl+ Alt+ e, um das Fenster Ausnahmeeinstellungen aufzurufen .
  2. Aktivieren Sie die Option Ausnahmen für die Common Language Runtime . Geben Sie hier die Bildbeschreibung ein

Das ist es!

Dieser Beitrag hat mich inspiriert, da ich eine x64-Version von Windows verwende .

Justin XL
quelle
7
Dies führt dazu, dass alle Ausnahmen unterbrochen werden, auch solche, die vom Benutzercode behandelt werden.
carlin.scott
1
@ carlin.scott, ich glaube, Sie könnten die Ausnahmen, die in der Liste behandelt werden, manuell deaktivieren.
Justin XL
6
@JustinXL Das Problem ist, dass dies eine Liste nach Ausnahmetyp ist, nicht danach, ob sie behandelt wird oder nicht. Zum Beispiel gibt es Zeiten, in denen System.ArgumentExceptionbehandelt wird, und Zeiten, in denen dies nicht der Fall ist. Ich kümmere mich nur darum zu brechen, wenn es nicht gehandhabt wird.
Jerad Rose
1
@JeradRose Der Debugger wird immer unterbrochen , wenn eine Ausnahme nicht behandelt wird. So wie ich schon sagte, wenn Sie keine Pause auf behandelte Ausnahmen mögen, deaktivieren Sie einfach , dass Ausnahmetypen aus der Pause , wenn Geworfen Liste.
Justin XL
Selbst wenn alles überprüft wird, bricht es keine Ausnahme: / nur beenden
Douglas Gaskell
10

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.

Olivier de Rivoyre
quelle
Dies rettete mich für eine andere Situation, in der VS2015 sich aus irgendeinem Grund weigerte, einen Code einzugeben. Der Code ist "mein", aber etwas hat das Flag "Nur mein Code" ausgelöst. Ich denke, irgendwo gibt es einen Fehler, wenn 2 Instanzen von VS und ein eigenständiger Webserver ausgeführt werden, und wahrscheinlich noch einige mehr.
LosManos
9

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:

Wichtige Notizen

  • Dieses neue Fenster enthält alle Funktionen des alten modalen Dialogfelds. Keine Funktionen des Debuggers haben sich geändert, nur die Art und Weise, wie Sie darauf zugreifen können
  • Der Debugger wird immer unterbrochen, 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 in ein Kontextmenü verschoben
  • Der Menüpunkt wurde auf Debug -> Windows -> Ausnahmeeinstellungen verschoben

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" * So aktivieren Sie die Spalte "Zusätzliche Aktionen"

Haferflocken
quelle
2
Dies funktioniert nicht genau wie VS2013, da es bei vom Benutzer behandelten Ausnahmen mit den von Ihnen vorgeschlagenen Einstellungen zu Problemen kommt, was in der Vergangenheit nicht der Fall war.
carlin.scott
Wie macht man die Spalte "Zusätzliche Optionen" sichtbar?
UuDdLrLrSs
@ DaveInCaz Klicken Sie mit der rechten Maustaste auf die Spaltenüberschrift> "Spalten
anzeigen
7

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:

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 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 TaskRückgabe von Test()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.

Dan Bryant
quelle
Obwohl dies möglicherweise nicht mit dem Problem der Operation zusammenhängt, wird ein sehr guter Punkt zu Ausnahmen in asynchronen Routinen angesprochen.
Phil Cooper
Gibt es eine Möglichkeit, den Debugger anzuhalten, obwohl die Ausnahme so gespeichert ist?
Lucas
@ Lucas, nicht dass ich es wüsste, obwohl Sie mit einigen Codeänderungen in die Nähe kommen können. Wenn Ihr Fire-and-Forget-Methodenkörper einen Try-Catch-Block hat, können Sie einen expliziten Debugger.Break()Aufruf hinzufügen . Alternativ können Sie Debugger.Break()dem TaskScheduler.UnobservedTaskExceptionHandler 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.
Dan Bryant
3

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.

Clint StLaurent
quelle
1

Befolgen Sie die Anweisungen:

  1. Öffnen Sie im Fenster Ausnahmeeinstellungen das Kontextmenü, indem Sie mit der rechten Maustaste in das Fenster klicken und dann Spalten anzeigen auswählen. (Wenn Sie Just My 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 Weiter angezeigt, wenn der Benutzercode bei bestimmten Ausnahmen nicht behandelt wird. Dies bedeutet, dass der Debugger nicht unterbrochen 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 (wählen Sie die Ausnahme aus, klicken Sie mit der rechten Maustaste und wählen Sie / Deaktivieren Sie Weiter, wenn im Benutzercode nicht behandelt) oder für eine ganze Kategorie von Ausnahmen (z. B. alle Common Language Runtime-Ausnahmen).

https://msdn.microsoft.com/en-us/library/x85tt0dd.aspx

Andrei
quelle
Absolute Zustimmung. Es ist schrecklich, diese Spalte standardmäßig nicht anzuzeigen. Verbrachte viel Zeit, um es zu finden. Außerdem ist ziemlich unklar , was "vom Benutzer nicht behandelte Ausnahme " bedeutet. Ich hatte meinen Handler für eine Aufgabenabbruch (so etwas wie try { task.Wait(); } catch { ... }) und OperationCanceledException in der Aufgabe wurde im Benutzercode irgendwie als nicht behandelt betrachtet.
Tsul
1

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.AccessViolationExceptionAuslösen von a unterbrochen, bei allen anderen Ausnahmen jedoch nur, wenn die Ausnahme vom Benutzer nicht behandelt wurde.

Visual Studio 2015 Ausnahmen Tool-Fenster

cedd
quelle
1

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:

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

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.

J. Wyckoff
quelle
1

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

Fenster "Ausnahmeeinstellungen" (Strg + Alt + E)

Um dies zu tun:

  1. Klicken Sie mit der rechten Maustaste auf die Ausnahme oder eine Reihe von Ausnahmen, die Sie interessieren (dh normalerweise die oberste Zeile "Common Language Runtime Exceptions" in der Baumstruktur).
  2. Wählen Sie die Option Weiter, wenn im Benutzercode nicht behandelt (siehe unten).
  3. Stellen Sie sicher, dass die Ausnahmen nicht aktiviert sind (siehe unten).
  4. Debuggen fortsetzen

Geben Sie hier die Bildbeschreibung ein

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

Dies war in VS 2015

Simon Sanderson
quelle
0

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

Simon_Weaver
quelle
0

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.

Moses
quelle