Stoppen Sie den Debugger nicht bei DIESER Ausnahme, wenn er ausgelöst und abgefangen wird

91

In Tools / Ausnahmen habe ich die Option festgelegt, dass der Debugger stoppt, wenn eine Ausnahme ausgelöst wird. Ob es gefangen wird oder nicht.

Wie schließe ich eine Ausnahme von dieser Regel aus? Irgendwo in meinem Code gibt es eine abgefangene Ausnahme, die Teil der Programmlogik ist. Daher möchte ich natürlich nicht, dass diese Ausnahme den Debugger jedes Mal stoppt, wenn er getroffen wird.

Beispiel: Ich möchte die Nullreferenz-Ausnahme (die abgefangen wird) in Zeile 344 ignorieren. Ich möchte bei allen anderen Ausnahmen aufhören

MichaelD
quelle
6
Wenn diese Ausnahme Teil Ihrer Programmierlogik ist (denken Sie darüber nach, ob Sie sie wirklich auf diese Weise implementieren müssen), sollte es sich zumindest um eine selbst erstellte, abgeleitete Ausnahme handeln. Auf diese Weise können Sie die Lösung von Brian anwenden.
Tanascius
Hier ist das Problem: stackoverflow.com/questions/1957907/…
MichaelD
2
@tanascius - +1 Ich stimme in den meisten Fällen zu Ausnahmen sind nicht der beste Weg, um eine logische Entscheidung zu treffen. In einigen Fällen, beispielsweise wenn das Deserialisieren von Handhabungsausnahmen manchmal unvermeidlich ist, ist throw> catch> handle die einzig vernünftige Option.
Jpierson
2
@Ando sorry mein schlechtes. Das gleichzeitige Moderieren mehrerer Registerkarten ist effizient, aber nicht immer korrekt.
2
@tanascius: Möglicherweise müssen Sie noch eine bekannte Framework-Ausnahme abfangen, bevor Sie Ihre eigene als Antwort auslösen können. Ihr Vorschlag ist nicht immer möglich.
Dan Puzey

Antworten:

40

Wenn ich mich richtig erinnere, können Sie ein DebuggerStepThroughAttribut für die Methode verwenden, die den Code enthält, für den keine Ausnahme ausgelöst werden soll. Ich nehme an, Sie können den Code, der die nervige Ausnahme auslöst, in einer Methode isolieren und mit dem Attribut dekorieren.

Chris Chou
quelle
31
Nach Malingers Antwort und meiner Erfahrung scheint diese Antwort falsch zu sein. Das DebuggerStepThroughAttribut beeinflusst das Verhalten des Debuggers mit Ausnahmen der ersten Chance nicht.
Michael Petrotta
5
@ Tim, ich habe getestet und es hört NICHT auf. checkout meine Antwort: stackoverflow.com/questions/1420390/3455100#3455100
Shimmy Weitzhandler
1
+1 funktioniert in VS2010 für reinen .NET 4.0- und Silverlight 4-Code für nicht behandelte Ausnahmen.
Mike Post
6
Wichtiger Hinweis: Dies funktioniert nicht für Methoden vom Typ Async-Warten. Mehr hier
i3arnon
8
Pro MSDN hat das DebuggerStepThroughAttribut für die CLR keine Bedeutung. Es wird von Debuggern interpretiert. Es scheint, dass es unter verschiedenen Umständen nicht zuverlässig funktioniert, und das DebuggerHiddenwird zuverlässig funktionieren stackoverflow.com/a/3455100/141172
Eric J.
64

DebuggerHidden ist dein Freund!

Die Common Language Runtime fügt diesem Attribut keine Semantik hinzu. Es wird zur Verwendung durch Quellcode-Debugger bereitgestellt. Beispielsweise stoppt der Visual Studio 2005-Debugger nicht in einer mit diesem Attribut gekennzeichneten Methode und lässt nicht zu, dass in der Methode ein Haltepunkt festgelegt wird. Andere vom Visual Studio 2005-Debugger erkannte Debugger-Attribute sind DebuggerNonUserCodeAttribute und DebuggerStepThroughAttribute.

Getestet auf VS2010 und funktioniert super.

Während DebuggerStepThroughes auch für einige bestimmte Debugger-Versionen DebuggerHiddenzu funktionieren scheint , scheint es für ein breiteres Spektrum von Situationen zu funktionieren, basierend auf den Kommentaren zu beiden Antworten.

Beachten Sie, dass beide Optionen derzeit nicht mit Iteratorblockmethoden oder für asynchrone / wartende Methoden funktionieren . Dies könnte in einem späteren Update von Visual Studio behoben werden.

Shimmy Weitzhandler
quelle
Arbeiten an VS2008. Sie müssen es auf die gesamte Methode anwenden, einschließlich des Fangblocks, oder Sie brechen einfach woanders ab
Mark Heath
1
Ich habe dieses Attribut einer Methode hinzugefügt und der Debugger hat stattdessen nur die aufrufende Methode angehalten. Vermisse ich etwas
Doogal
1
Das ist wie es sein sollte. Um dies zu vermeiden, müssen Sie die Ausnahme behandeln ... Oder alternativ auch die Aufrufermethode markieren DebuggerHidden...
Shimmy Weitzhandler
1
Beachten Sie, dass das Attribut DebuggerStepThrough ausreichen sollte, um zu vermeiden, dass Ausnahmen unterbrochen werden. DebuggerHidden verhält sich wie eine Kombination aus DebuggerNonUserCode und dem DebuggerStepThrough-Attribut.
Jpierson
14

DebuggerStepThrough wird verwendet, um zu verhindern, dass der Debugger eine Methode einbricht, bei der es einen Versuch / Fang gibt.

Dies funktioniert jedoch nur, wenn Sie die Option "Nur meinen Code aktivieren (nur verwaltet)" in den allgemeinen Einstellungen der Debugging-Optionen von Visual Studio (Menü Extras / Optionen, Knoten Debugging / Allgemein) nicht deaktiviert haben.

Weitere Informationen zu diesem Attribut finden Sie unter http://abhijitjana.net/2010/09/22/tips-on-debugging-using-debuggerstepthrough-attribute/

DebuggerHidden verhindert einfach, dass der Debugger die Methode anzeigt, bei der die Ausnahme ausgelöst wird. Stattdessen wird die erste Methode auf dem Stapel angezeigt, die nicht mit diesem Attribut gekennzeichnet ist ...

Valery Letroye
quelle
1
Beachten Sie, dass dies in VS 2015 nicht mehr standardmäßig funktioniert.
Informationen
Leider funktioniert die VS 2015-
Jonathan Allen
13

Die in den anderen Antworten angegebenen Attribute (und andere wie das DebuggerNonUserCodeAttribut) funktionieren in Visual Studio 2015 standardmäßig nicht mehr auf die gleiche Weise. Der Debugger bricht im Gegensatz zu älteren Versionen von VS Ausnahmen im Methodenmarkt mit diesen Attributen ab. Um die Leistungsverbesserung zu deaktivieren, die ihr Verhalten geändert hat, müssen Sie eine Registrierungseinstellung ändern:

reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1

Weitere Informationen finden Sie im Visual Studio-Blog .

(Dies sollte wahrscheinlich ein Kommentar zur Top-Antwort sein, aber ich habe nicht genug Wiederholungen)

bhh
quelle
3

Sie können eine Ausnahme, die an einer bestimmten Stelle in Ihrem Code ausgelöst wurde, nicht herausgreifen. Sie können jedoch Ausnahmen eines bestimmten Typs deaktivieren.

Wenn Ihr eigener Code die fragliche Ausnahme auslöst, würde ich sie zu einer benutzerdefinierten Ausnahme machen, die von dem abgeleitet wird, was passt, und dann das Debug-Brechen für diesen abgeleiteten Typ deaktivieren.

Das Deaktivieren von Systemausnahmen als NullReferenceException wirkt sich auf das gesamte System aus, was während der Entwicklung natürlich nicht wünschenswert ist.

Beachten Sie, dass es für Ausnahmen zwei Arten von Unterbrechungsverhalten gibt:

  • Ausgelöst: Wenn diese Option ausgewählt ist, wird sie unterbrochen, sobald eine Ausnahme dieses Typs ausgelöst wird
  • Vom Benutzer nicht behandelt: Wenn diese Option ausgewählt ist, wird sie nur unterbrochen, wenn die Ausnahme dieses Typs nicht von einem Versuch / Fang behandelt wird.

Sie können die Prüfung in 'Thrown' für die NullReferenceException entfernen, wodurch Sie den Vorteil haben, dass Sie nicht jedes Mal brechen, wenn Ihr System die betreffende Zeile in Ihrem Code passiert, sondern trotzdem brechen, wenn in anderen Teilen der NullReference-Erwartung eine unbehandelte NullReference-Erwartung auftritt System.

Lars Udengaard
quelle
3
Durch Hinzufügen des DebuggerStepThrough-Attributs zu einer Methode in Visual Studio 2010 wird verhindert, dass der Debugger eine nicht behandelte Ausnahme anhält, die von der Methode ausgelöst wird.
Tim Murphy
Ich habe getestet und es verhindert nicht; es hört immer noch auf
Shimmy Weitzhandler
1
@ Shimmy - Funktioniert für mich! Stellen Sie sicher, dass Sie DebuggerStepThrough von dem Punkt, an dem es ausgelöst wird, bis zu dem Punkt, an dem die Ausnahme im Aufrufstapel sichtbar werden soll, auf jede Methode anwenden. Wenn Sie die Ausnahme abfangen und innerhalb der Aufrufhierarchie behandeln, in der alle Methoden mit DebuggerStepThrough dekoriert sind, sollte VS bei dieser Ausnahme niemals unterbrochen werden.
Jpierson