W narzędziach / wyjątkach ustawiłem opcję zatrzymywania debugera po wyrzuceniu wyjątku. Czy zostanie złapany, czy nie.
Jak wykluczyć wyjątek od tej reguły? Gdzieś w moim kodzie znajduje się przechwycony wyjątek, który jest częścią logiki programu. Więc oczywiście nie chcę, aby ten wyjątek zatrzymywał debuger za każdym razem, gdy zostanie trafiony.
Przykład: chcę zignorować wyjątek nullreference (który jest przechwytywany) w linii 344. Chcę się zatrzymać na wszystkich innych wyjątkach
Odpowiedzi:
Jeśli dobrze pamiętam, możesz użyć
DebuggerStepThrough
atrybutu w metodzie, która zawiera kod, którego nie chcesz, aby wyjątek był uruchamiany. Przypuszczam, że możesz wyodrębnić kod, który uruchamia irytujący wyjątek w metodzie i ozdobić go atrybutem.źródło
DebuggerStepThrough
Atrybut nie ma wpływu na zachowanie debugera jest z wyjątkami pierwszy przypadek.DebuggerStepThrough
atrybut nie ma znaczenia dla środowiska CLR. Jest interpretowany przez debuggery. Wygląda na to, że nie działa niezawodnie w różnych okolicznościach, a toDebuggerHidden
będzie działać niezawodnie stackoverflow.com/a/3455100/141172DebuggerHidden
jest twoim przyjacielem!Testowany na VS2010 i działa świetnie.
Chociaż
DebuggerStepThrough
wydaje się, że działa również dla niektórych konkretnych wersji debugera,DebuggerHidden
wydaje się działać w szerszym zakresie sytuacji w oparciu o komentarze do obu odpowiedzi.Zauważ, że obie opcje nie działają obecnie z metodami blokowymi iteratora lub metodami async / await . Można to naprawić w późniejszej aktualizacji programu Visual Studio.
źródło
DebuggerHidden
...DebuggerStepThrough to ten, który ma być używany, aby uniemożliwić debugerowi przerwanie metody, w której istnieje próba / przechwycenie.
Ale działa tylko wtedy, gdy nie odznaczysz opcji „Włącz tylko mój kod (tylko zarządzany)” w ustawieniach ogólnych opcji debugowania programu Visual Studio (menu Narzędzia / Opcje, debugowanie węzła / Ogólne) ...
Więcej informacji na temat tego atrybutu można znaleźć pod adresem http://abhijitjana.net/2010/09/22/tips-on-debugging-using-debuggerstepthrough-attribute/
DebuggerHidden po prostu uniemożliwi Debuggerowi wyświetlenie metody, w której jest zgłaszany wyjątek. Zamiast tego pokaże pierwszą metodę na stosie, która nie jest oznaczona tym atrybutem ...
źródło
Atrybuty określone w innych odpowiedziach (i innych, takich jak
DebuggerNonUserCode
atrybut) nie działają już domyślnie w ten sam sposób w programie Visual Studio 2015. Debugger będzie przerywał wyjątki na rynku metod z tymi atrybutami, w przeciwieństwie do starszych wersji VS. Aby wyłączyć ulepszenie wydajności, które zmieniło ich zachowanie, musisz zmienić ustawienie rejestru:reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1
Więcej informacji można znaleźć na blogu Visual Studio .
(To prawdopodobnie powinien być komentarz do najlepszej odpowiedzi, ale nie mam wystarczającej liczby przedstawicieli)
źródło
Nie jesteś w stanie wyodrębnić wyjątku rzuconego w określonym miejscu w kodzie. Możesz jednak wyłączyć wyjątki określonego typu.
Jeśli twój własny kod zgłasza dany wyjątek, uczyniłbym go niestandardowym wyjątkiem, pochodzącym z wszystkiego, co pasuje, a następnie wyłączam łamanie debugowania dla tego typu pochodnego.
Wyłączenie wyjątków systemowych jako NullReferenceException wpłynie na cały system, co oczywiście nie jest pożądane podczas programowania.
Zauważ, że istnieją dwa rodzaje zachowań związanych z zerwaniem dla wyjątków:
Możesz usunąć zaznaczenie „Thrown” dla wyjątku NullReferenceException, co zapewni ci korzyść polegającą na tym, że nie przerywa się za każdym razem, gdy system przechodzi przez dany wiersz w kodzie, ale nadal się psuje, jeśli masz nieobsłużone oczekiwanie NullReference występujące w innych częściach system.
źródło