Vermeiden von Ausnahmemeldungen der ersten Chance, wenn die Ausnahme sicher behandelt wird

77

Das folgende Codebit fängt die EOS-Ausnahme ab

using (var reader = new BinaryReader(httpRequestBodyStream)) {

    try {
        while (true) {
            bodyByteList.Add(reader.ReadByte());
        }
    } catch (EndOfStreamException) { }
}

Warum erhalte ich in meiner Konsole immer noch Ausnahmen der ersten Chance?

In mscorlib.dll ist eine Ausnahme vom Typ 'System.IO.EndOfStreamException' aufgetreten

Gibt es eine Möglichkeit, diese Ausnahmemeldungen der ersten Chance auszublenden?

CVertex
quelle

Antworten:

79

Der Punkt der "First-Chance" -Ausnahmen ist, dass Sie sie als Pre-Handler sehen, damit Sie sie beim Debuggen am Punkt des Werfens anhalten können. Eine Ausnahme der zweiten Chance ist eine Ausnahme, für die kein geeigneter Handler vorhanden ist. Manchmal möchten Sie Ausnahmen der ersten Chance abfangen, weil es wichtig ist zu sehen, was passiert, wenn es geworfen wird, auch wenn jemand es abfängt.

Es gibt nichts zu befürchten. Dies ist normales Verhalten.

Brad Wilson
quelle
58
In der Tat ist es nichts, worüber man sich Sorgen machen muss, aber sie überladen das Debug-Ausgabeprotokoll :(
Dimitri C.
190

Um zu vermeiden, dass die Nachrichten angezeigt werden, klicken Sie mit der rechten Maustaste auf das Ausgabefenster und deaktivieren Sie "Ausnahmemeldungen".

Es kann jedoch hilfreich sein, sie zu sehen, wenn Sie wissen möchten, wann Ausnahmen ausgelöst werden, ohne Haltepunkte festzulegen und den Debugger neu zu konfigurieren.

André Chalella
quelle
19

1) In Visual Studio können Sie die Einstellungen für die Behandlung (Unterbrechung) von Ausnahmen durch den Debugger ändern.

Gehen Sie zu Debug> Ausnahmen. (Beachten Sie, dass dies abhängig von Ihrer Visual Studio-Umgebungseinstellung möglicherweise nicht in Ihrem Menü enthalten ist. Wenn Sie es nicht einfach über das Menü Anpassen zu Ihrem Menü hinzufügen.)

Dort wird Ihnen ein Dialog mit Ausnahmen angezeigt und wann Sie darauf verzichten müssen.

In der Zeile "Common Language Runtime Exceptions" können Sie die Auswahl von "geworfen" deaktivieren (was Sie dann nicht mehr über Ausnahmen der ersten Chance stören sollte) und Sie können auch die Auswahl von "User-unhandeled" (was ich nicht empfehlen würde) deaktivieren, wenn Sie möchten.

2) Die Nachricht, die Sie erhalten, sollte sich nicht in der Konsole befinden, sondern im Fenster "Ausgabe" von Visual Studio angezeigt werden. Wenn letzteres der Fall ist, habe ich keine Möglichkeit gefunden, dies zu entfernen, aber es wird nicht angezeigt, wenn Sie die App ohne Visual Studio ausführen.

Hoffentlich hilft das.

Alex Duggleby
quelle
11

Im Gegensatz zu Java sind .NET-Ausnahmen in Bezug auf die Verarbeitungsleistung ziemlich teuer, und behandelte Ausnahmen sollten im normalen und erfolgreichen Ausführungspfad vermieden werden.

Sie vermeiden nicht nur Unordnung im Konsolenfenster, sondern verbessern auch Ihre Leistung und machen Leistungsindikatoren wie .NET CLR-Ausnahmen aussagekräftiger.

In diesem Beispiel würden Sie verwenden

while (reader.PeekChar() != -1)
{
    bodyByteList.Add(reader.ReadByte());
}
Loudej
quelle
1
Oder Sie können mit ReadBytes alle Bytes auf einmal abrufen und auch die Pufferung verwenden. aber ich denke das war nicht die Frage.
Craig Tyler
9
Sicher tut es das. "Gibt es eine Möglichkeit, diese Ausnahmemeldungen der ersten Chance auszublenden?" - Die Ausnahmen der ersten Chance werden bei dieser Schleife nicht angezeigt. :)
Loudej
7

Ich hatte dieses Problem und konnte nicht herausfinden, wo die Ausnahme ausgelöst wurde. Meine Lösung bestand also darin, Visual Studio zu ermöglichen, die Ausführung dieser Art von Ausnahme zu beenden.

  1. Navigieren Sie zu "Debug / Ausnahmen"
  2. Erweitern Sie den Baum "Common Language Runtime Exceptions".
  3. Erweitern Sie den Zweig "System".
  4. Scrollen Sie nach unten zu "NullReferenceException", aktivieren Sie das Kontrollkästchen "throw" und deaktivieren Sie das Kontrollkästchen "user-handle".
  5. Debuggen Sie Ihr Projekt.
Hallgeir Engen
quelle
4

Wenn Sie mehr Kontrolle über diese Nachrichten wünschen, können Sie einen Handler hinzufügen:

Friend Sub AddTheHandler()
AddHandler AppDomain.CurrentDomain.FirstChanceException, AddressOf FirstChanceExceptionHandler
End Sub

<Conditional("DEBUG")>
Friend Sub FirstChanceExceptionHandler( source As Object,  e As Runtime.ExceptionServices.FirstChanceExceptionEventArgs)
' Process first chance exception

End Sub

Auf diese Weise können Sie sie wie in anderen Kommentaren erwähnt zum Schweigen bringen, stellen jedoch sicher, dass Sie sich ihrer bewusst sind. Ich finde es gut zu sehen, wie viele ich wirklich werfe, wenn ich eine Nachricht und einen Zeitstempel in einer Textdatei protokolliere.

VoteCoffee
quelle
1
Guter Vorschlag. Beachten Sie jedoch, dass System.Runtime.ExceptionServices nur in .NET 4.0 oder höher verfügbar ist. Für diejenigen von uns, die sich mit Legacy-Code beschäftigen, der gegen .Net 3.5 (oder älter) geschrieben wurde.
Pauls4
Ist gültig für ASP.NET ?
Kiquenet
2

Wenn Sie viele Ausnahmen pro Sekunde haben, müssen Sie eine bessere Leistung erzielen, indem Sie den Reader überprüfen. EndOfStream-Wert. Das Ausdrucken dieser Ausnahmemeldungen ist unglaublich langsam, und das Ausblenden in Visual Studio beschleunigt nichts.

AareP
quelle
-1

in VB.NET:

<DebuggerHidden()> _
Public Function Write(ByVal Text As String) As Boolean
   ...
Peter Mortensen
quelle
1
Das hat nichts mit der Frage zu tun.
John Saunders
Eigentlich mit [DebuggerNonUserCode] tut verstecken „erste Chance“ -Nachrichten. Ich wäre nicht überrascht, wenn DebuggerHidden dies auch tut.
Ruben
Ich bin nicht sicher, ob dies als Ausnahmen betrachtet wird, aber [DebuggerNonUserCode] verbirgt keinen der "Managed Debugging Assistants". Beispielsweise erhalte ich BindingFailures, wenn ich XmlSerializer verwende, und ich habe noch keine Möglichkeit gefunden, es auszublenden, außer das Deaktivieren von BindingFailure beim Auslösen im Dialogfeld "Ausnahmen".
Anthony Brien
Es scheint, dass die Verwendung von DebuggerHiddenAttributenur bedeutet, dass die Ausnahme der ersten Chance in der aufrufenden Methode und nicht in der Methode selbst angezeigt wird.
Thorarin
-4

Ich denke, der Stream löst diese Ausnahme aus, daher ist Ihr Versuch zu eng, um sie abzufangen.

Fügen Sie noch ein paar weitere Catch-Combos für die verschiedenen Bereiche hinzu, bis Sie sie dort abfangen, wo sie tatsächlich geworfen werden. Dies scheint jedoch auch außerhalb unserer Verwendung zu geschehen, da das Stream-Objekt nicht im Bereich der Verwendung erstellt wird.

Entwicklung von Chris
quelle