2008-09-12 8 views
75

Poniższy fragment kodu łapie wyjątek EOSUnikanie pierwsze komunikaty o wyjątkach szansę, gdy wyjątek jest bezpiecznie obchodzić

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

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

Dlaczego więc nadal otrzymywać wyjątki pierwszej szansa na konsolę?

Pierwsza szansa wyjątek typu „System.IO.EndOfStreamException” wystąpił w mscorlib.dll

Czy istnieje sposób, aby ukryć te komunikaty o wyjątkach pierwsza szansa?

Odpowiedz

77

Punktem wyjątków "pierwszej szansy" jest to, że widzisz ich jako pre-handler, dzięki czemu możesz zatrzymać się na nich podczas debugowania w momencie rzucania. Wyjątek "drugiej szansy" to taki, który nie ma odpowiedniego programu obsługi. Czasami chcesz złapać wyjątki "pierwszej szansy", ponieważ ważne jest, aby zobaczyć, co się dzieje, gdy jest rzucany, nawet jeśli ktoś go łapie.

Nie ma się czym martwić. To normalne zachowanie.

+56

Rzeczywiście, to nic się zajmować, ale robią zaśmiecać dziennik debugowania :( –

-4

Myślę, że strumień rzuca ten wyjątek, więc Twoja próba jest zawężona, aby go złapać.

Dodaj jeszcze kilka spróbuj przechwytywać kombinacje wokół różnych zakresów, aż złapiesz je tam, gdzie jest on faktycznie rzucany, ale wydaje się, że dzieje się to na zewnątrz, ponieważ obiekt strumienia nie jest tworzony w zakresie użycia .

19

1) W Visual Studio można zmienić ustawienia sposobu, w jaki debugger obsługuje wyjątki (włamuje się).

Przejdź do Debugowanie> Wyjątki. (Zauważ, że to może nie być w twoim menu, w zależności od ustawienia środowiska Visual Studio. Jeśli nie tylko dodasz je do swojego menu za pomocą menu Dostosuj.)

W tym miejscu pojawi się okno dialogowe wyjątków i godzina ich rozbicia .

W wierszu "Wyjątki środowiska wykonawczego języka wspólnego" można odznaczyć wyrzucone (które powinno przestać zawracać sobie głowę wyjątkami pierwszej szansy), a także można odznaczyć opcję Odłączony użytkownik (którego nie polecam), jeśli chce.

2) Otrzymywana wiadomość nie powinna znajdować się w konsoli, ale powinna pojawić się w oknie "Wyjście" programu Visual Studio. Jeśli tak jest, to nie znalazłem możliwości usunięcia tego, ale nie pojawi się, jeśli uruchomisz aplikację bez Visual Studio.

Nadzieję, że pomaga.

10

W przeciwieństwie do Java, wyjątki .NET są dość drogie pod względem mocy obliczeniowej i należy unikać wyjątków obsługiwanych w normalnej i pomyślnej ścieżce wykonania.

Nie tylko pozwoli to uniknąć bałaganu w oknie konsoli, ale poprawi się wydajność i sprawi, że liczniki wydajności, takie jak wyjątki .NET CLR, będą bardziej znaczące.

W tym przykładzie należy użyć

while (reader.PeekChar() != -1) 
{ 
    bodyByteList.Add(reader.ReadByte()); 
} 
+0

lub można uzyskać wszystkie bajty w jednym ujęciu z ReadBytes a także skorzystać z buforowania. Ale myślę, że nie był” t pytanie: –

+4

Nie odpowiada na pytanie –

+9

Oczywiście. "Czy istnieje sposób na ukrycie wiadomości o wyjątkach pierwszej szansy?" - wyjątki pierwszej szansy nie pojawiłyby się w tej pętli. :) – loudej

189

Aby uniknąć obejrzeniu wiadomości, kliknij prawym przyciskiem myszy w oknie wyjściowym i odznacz „Wiadomości Exception”.

Jednak ich zobaczenie może być miłe, jeśli chcesz wiedzieć, kiedy wyjątki są zgłaszane bez ustawiania pułapek i ponownej konfiguracji debuggera.

+7

Dokładna nazwa to " Komunikaty o wyjątkach ". Dziękuję za odpowiedź na drugą połowę pytania. – StriplingWarrior

-1

w VB.NET:

<DebuggerHidden()> _ 
Public Function Write(ByVal Text As String) As Boolean 
    ... 
+1

Nie ma to nic wspólnego z pytaniem. –

+0

W rzeczywistości przy użyciu [DebuggerNonUserCode] * nie * ukrywa się komunikat "wyjątek pierwszej szansy". Nie byłbym zaskoczony DebuggerUkryto to również. – Ruben

+0

Nie jestem pewien, czy są to wyjątki, ale [DebuggerNonUserCode] nie ukryje żadnego "Managed Debugging Assistants". Na przykład, otrzymuję BindingFailures, gdy używam XmlSerializer, i jeszcze nie znalazłem sposobu, aby to ukryć, poza odznaczeniem BindingFailure, gdy został wyrzucony z okna dialogowego Exceptions. –

2

Właściwie jeśli mają wiele wyjątków na sekundę, będzie można osiągnąć lepszą wydajność moszczu sprawdzając reader.EndOfStream wartości .. Drukowanie na te komunikaty o wyjątkach jest niewiarygodnie powolny, a ukrywanie ich w visual studio nie przyspieszy niczego.

7

Miałem ten problem i nie mogłem ustalić, gdzie wyjątek został zgłoszony. Dlatego moim rozwiązaniem było umożliwienie Visual Studio zatrzymanie wykonywania na tego rodzaju wyjątku.

  1. Nawiguj do "Debug/wyjątki"
  2. Rozwiń "Wyjątki" Common Language Runtime drzewo.
  3. Rozwiń gałąź "System".
  4. Przewiń w dół do miejsca, w którym znajduje się "NullReferenceException" i zaznacz pole wyboru "throw" (odrzuć) , a następnie odznacz pole "user-handled".
  5. Debuguj swój projekt.
4

Jeśli chcesz mieć większą kontrolę nad tych komunikatów, można dodać Handler:

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 

To pozwala wyciszyć je jak wspomniano w innych opinii, ale nadal sprawia, że ​​jesteś w stanie być świadomi z nich. Uważam, że dobrze jest zobaczyć, ile naprawdę rzucam, jeśli loguję wiadomość i znacznik czasu do pliku tekstowego.

+1

Dobra sugestia. Warto jednak zauważyć, że usługa System.Runtime.ExceptionServices jest dostępna tylko w .Net 4.0 lub nowszym. Dla tych z nas, którzy mają do czynienia ze starszym kodem napisanym na .Net 3.5 (lub starszym). – paulsm4

+0

Czy dotyczy *** ASP.NET ***? – Kiquenet

Powiązane problemy