Visual Studio: jak przerwać obsługę wyjątków?

165

Chciałbym, aby program Visual Studio przestał działać, gdy wystąpi obsługiwany wyjątek (tj. Nie chcę tylko widzieć komunikat „Pierwsza szansa”, chcę debugować rzeczywisty wyjątek).

np. chcę, aby debugger przerwał wyjątek:

try
{
   System.IO.File.Delete(someFilename);
}
catch (Exception)
{
   //we really don't care at runtime if the file couldn't be deleted
}

Natknąłem się na te uwagi dotyczące Visual Studio.NET:

1) W VS.NET przejdź do menu debugowania >> „Wyjątki ...” >> „Wyjątki środowiska uruchomieniowego języka wspólnego” >> „System” i wybierz opcję „System.NullReferenceException”

2) W dolnej części tego okna dialogowego znajduje się pole grupy „Po zgłoszeniu wyjątku:”, wybierz „Włam się do debugera”

3) Uruchom swój scenariusz. Gdy wyjątek zostanie zgłoszony, debugger zatrzyma się i powiadomi Cię w oknie dialogowym, które mówi coś takiego: „Został zgłoszony wyjątek typu„ System.NullReferenceException ”. [Przerwij] [Kontynuuj]”

Hit [Break]. To umieści Cię w wierszu kodu, który powoduje problem.

Ale nie mają zastosowania do programu Visual Studio 2005 ( w menu Debug nie ma opcji Wyjątki ).

Czy ktoś wie, gdzie znajduje się okno dialogowe opcji znajdowania w programie Visual Studio, w którym znajduje się pole grupy „ Gdy zostanie zgłoszony wyjątek ” z opcją „ Przenieś się do debugera ”?

Aktualizacja: Problem polegał na tym, że w moim menu Debugowanie nie było pozycji Wyjątki . Dostosowałem menu, aby dodać je ręcznie.

Ian Boyd
źródło
9
W VS2015 znajdował się w obszarze Debug-> Windows-> Ustawienia wyjątków
PeterVermont
Zajęło mi trochę czasu, aby znaleźć sposób, aby przywrócić te domyślne ustawienia wyjątków po zmianie niektórych ustawień wyjątku, dlatego nową odpowiedź. przywrócić ustawienia wyjątków do wartości domyślnych
Mabito

Odpowiedzi:

170

Po otwarciu rozwiązania przejdź do opcji menu Debuguj - Wyjątki ( Ctrl+ D, E). Stamtąd możesz wybrać przerwanie w wyjątkach rzuconych lub nieobsługiwanych przez użytkownika .

EDYCJA: Moje wystąpienie jest skonfigurowane z „profilem” C #, może nie ma go dla innych profili?

Austin Salonen
źródło
10
po prostu nie mam takiej możliwości. To by wyjaśniało moje zmieszanie.
Ian Boyd
58
Miałem menu debugowania, ale bez opcji wyjątków. dostosowałem menu, aby dodać je ręcznie; klawisz skrótu działał w obie strony (Ctrl + Alt + E)
Ian Boyd
3
Możesz także zresetować środowisko VS2010, przechodząc do „Narzędzia”, „Importuj ustawienia eksportu” i wybierając resetowanie do środowiska C #… zawiera on pozycję podmenu Wyjątki
BeardinaSuit
14
Wybrałem Common Language Runtime Exceptions> <All Common Language Runtime Exceptions not in this list>pod Visual Studio 2017 i spełniłem wszystkie moje najśmielsze marzenia.
Aaron Newton
9
Visual Studio 2015: Debugowanie -> Windows -> Ustawienia wyjątków
achecopar
47

W VS2005 jest okno „wyjątków” ... spróbuj Ctrl+ Alt+ Epodczas debugowania i kliknij pole wyboru „Zgłoszenie” dla wyjątku, na którym chcesz się zatrzymać.

Rob Walker
źródło
Dokładnie tego chcę. Gdzie to jest w menu? Nie mogę tego znaleźć za moje życie.
Ian Boyd,
Skrót klawiaturowy może się zmieniać w zależności od profilu (programista C #, programista C ++ itp.)
Asaf R
1
Mam pozycję menu: Debuguj -> Wyjątki. Tak jest w przypadku VS2005 Professional. Czy korzystasz z wersji Express?
Rob Walker
5
jeśli chcesz wybrać pozycję menu Wyjątki: Wybierz Narzędzia | Dostosuj .... Kliknij kartę Polecenia. Wybierz kategorię Debugowanie w polu Kategorie. Znajdź element polecenia Wyjątki ..., a następnie przeciągnij go do menu Debuguj w górnej części aplikacji, upuszczając go w odpowiednim miejscu w menu. (znalezione w komentarzach na: blogs.vertigo.com/personal/keithc/Blog/archive/2007/07/20/… )
sotto
33

Zajęło mi trochę czasu, zanim znalazłem nowe miejsce na ustawienia oczekiwań, a zatem nowa odpowiedź.

Od programu Visual Studio 2015 możesz kontrolować, które wyjątki mają zostać zatrzymane w oknie Ustawienia wyjątków (Debugowanie -> Windows -> Ustawienia wyjątków). Skrót jest nadal Ctrl- Alt- E.

Najprostszym sposobem obsługi wyjątków niestandardowych jest wybranie „wszystkich wyjątków, których nie ma na tej liście”.

Oto zrzut ekranu z wersji angielskiej:

wprowadź opis obrazu tutaj

Oto zrzut ekranu z wersji niemieckiej:

wprowadź opis obrazu tutaj

Początkujący
źródło
16

W programie Visual Studio 2015 i nowszych musisz przejść do okna dialogowego „Ustawienia wyjątków” ( Ctrl+ Alt+ E) i zaznaczyć „Wyjątki środowiska uruchomieniowego języka wspólnego” (lub konkretny, na przykład ArgumentNullException), aby przerwać obsługę wyjątków.

Krok 1 Krok 1 Krok 2 Krok 2

Sameer Alibhai
źródło
8

Sprawdź Zarządzanie wyjątkami na stronie Debuggera , wyjaśnia, jak to ustawić.

Zasadniczo oto kroki (podczas debugowania):

  1. W menu Debug kliknij opcję Wyjątki.

  2. W oknie dialogowym Wyjątki wybierz opcję Zgłoszone dla całej kategorii wyjątków, na przykład Wyjątki środowiska wykonawczego języka wspólnego.

    -lub-

    Rozwiń węzeł dla kategorii wyjątków, na przykład wyjątków środowiska wykonawczego języka wspólnego, i wybierz opcję Zgłoszony dla określonego wyjątku w tej kategorii.

Guy Starbuck
źródło
1

Technika, której używam, jest podobna do poniższej. Zdefiniuj zmienną globalną, której możesz użyć dla jednego lub wielu bloków try catch w zależności od tego, co próbujesz debugować, i użyj następującej struktury:

if(!GlobalTestingBool)
{
   try
   {
      SomeErrorProneMethod();
   }
   catch (...)
   {
      // ... Error handling ...
   }
}
else
{
   SomeErrorProneMethod();
}

Uważam, że daje mi to nieco większą elastyczność pod względem testowania, ponieważ wciąż są pewne wyjątki, na które nie chcę, aby IDE się zepsuło.

Spencer Ruport
źródło
3
Jest to przydatna technika - zmienia obsłużony wyjątek w nieobsługiwany wyjątek, więc debugger zatrzymuje się na nim automatycznie. Nie jestem pewien, dlaczego został odrzucony, chyba że nie ma dobrego sposobu na ustawienie GlobalTestingBool. Inną, prawdopodobnie lepszą opcją jest użycie Debugger.IsAttached.
Joe White
Będziesz musiał dodać to do każdej próby / złapania i ponownie skompilować swój kod. Niezbyt przydatne, jeśli jesteś już w trakcie debugowania czegoś.
Maksymalnie
Wyjątek powinien zostać wrzucony do kodu, jeśli istnieje wyjątkowy warunek - coś niedopuszczalnego - i powinien zostać przechwycony na poziomie, na którym można podjąć decyzję, jak sobie z nim poradzić. Kod taki jak ten komplikuje ścieżki wykonania.
Lee Oades
Wiem, że to naprawdę stara odpowiedź, ale dla przypadkowych pracowników Google, takich jak ja, możesz po prostu dodaćcatch(){/*handle or not*/ throw; } // throw without any exception specified will rethrow original exception with original callstack etc
Jan „splite” K.
0

Dokumentacja online wydaje się trochę niejasna, więc przeprowadziłem mały test. Wybranie przerwy przy Zgłoszeniu z okna dialogowego Wyjątki powoduje przerwanie wykonywania programu w przypadku każdego wyjątku, obsługiwanego lub nieobsługiwanego. Jeśli chcesz przerwać tylko dla obsługiwanych wyjątków, wydaje się, że jedynym rozwiązaniem jest przejście przez kod i umieszczenie punktów przerwania na wszystkich obsługiwanych wyjątkach. Wydaje się to trochę przesadne, więc lepiej byłoby dodać instrukcję debugowania za każdym razem, gdy obsługujesz wyjątek. Następnie, gdy zobaczysz te dane wyjściowe, możesz ustawić punkt przerwania w tym wierszu kodu.

markysdad
źródło