Zarządzanie wyjątkami za pomocą debugera w programie Visual Studio
Wyjątek wskazuje stan błędu, który występuje podczas wykonywania programu. Możesz poinformować debuger, które wyjątki lub zestawy wyjątków mają zostać przerwane, i w którym momencie debuger ma przerwać (czyli wstrzymać w debugerze). Gdy debuger przerywa działanie, pokazuje, gdzie został zgłoszony wyjątek. Można również dodawać lub usuwać wyjątki. Po otwarciu rozwiązania w programie Visual Studio otwórz okno Wyjątki debugowania > systemu Windows > Ustawienia, aby otworzyć okno Ustawienia wyjątku.
Podaj programy obsługi, które odpowiadają na najważniejsze wyjątki. Jeśli musisz wiedzieć, jak dodać programy obsługi dla wyjątków, zobacz Naprawianie usterek przez napisanie lepszego kodu w języku C#. Dowiedz się również, jak skonfigurować debuger tak, aby zawsze przerywał wykonywanie niektórych wyjątków.
W przypadku wystąpienia wyjątku debuger zapisuje komunikat o wyjątku w oknie Dane wyjściowe . Może to spowodować przerwanie wykonywania w następujących przypadkach:
- Zgłaszany jest wyjątek, który nie jest obsługiwany.
- Debuger jest skonfigurowany do przerywania wykonywania przed wywołaniem jakiejkolwiek procedury obsługi.
- Ustawiono opcję Just My Code (Tylko mój kod), a debuger jest skonfigurowany tak, aby przerwał wszelkie wyjątki, które nie są obsługiwane w kodzie użytkownika.
Uwaga
ASP.NET ma procedurę obsługi wyjątków najwyższego poziomu, która wyświetla strony błędów w przeglądarce. Nie powoduje to przerwania wykonywania, chyba że opcja Tylko mój kod jest włączona. Przykład można znaleźć w temacie Tell the debugger to continue on user-unhandled exceptions below (Poinformuj debuger o kontynuowaniu obsługi wyjątków nieobsługiwanych przez użytkownika).
Uwaga
W aplikacji Visual Basic debuger zarządza wszystkimi błędami jako wyjątkami, nawet jeśli używasz procedur obsługi błędów w stylu błędu.
Poinformuj debuger o przerwaniu w przypadku zgłoszenia wyjątku
Debuger może przerwać wykonywanie w punkcie, w którym jest zgłaszany wyjątek, więc można sprawdzić wyjątek przed wywołaniem programu obsługi.
W oknie Wyjątki Ustawienia (Debugowanie > wyjątku systemu Windows > Ustawienia) rozwiń węzeł dla kategorii wyjątków, takich jak wyjątki środowiska uruchomieniowego języka wspólnego. Następnie zaznacz pole wyboru dla określonego wyjątku w tej kategorii, takiego jak System.AccessViolationException. Możesz również wybrać całą kategorię wyjątków.
Napiwek
Określone wyjątki można znaleźć za pomocą okna Wyszukiwania na pasku narzędzi Wyjątki Ustawienia lub użyć wyszukiwania do filtrowania określonych przestrzeni nazw (takich jak System.IO).
Jeśli wybierzesz wyjątek w oknie Wyjątek Ustawienia, wykonanie debugera spowoduje przerwanie wszędzie tam, gdzie jest zgłaszany wyjątek, bez względu na to, czy jest on obsługiwany. Teraz wyjątek jest nazywany wyjątkiem pierwszej szansy. Oto na przykład kilka scenariuszy:
W poniższej aplikacji konsolowej języka C# metoda Main zgłasza wyjątek AccessViolationException wewnątrz
try/catch
bloku.static void Main(string[] args) { try { throw new AccessViolationException(); Console.WriteLine("here"); } catch (Exception e) { Console.WriteLine("caught exception"); } Console.WriteLine("goodbye"); }
Jeśli w Ustawienia wyjątku jest zaewidencjonowany wyjątek AccessViolationException, wykonanie zostanie przerwane w
throw
wierszu po uruchomieniu tego kodu w debugerze. Następnie możesz kontynuować wykonywanie. Konsola powinna wyświetlać oba wiersze:caught exception goodbye
ale nie wyświetla
here
wiersza.Aplikacja konsolowa języka C# odwołuje się do biblioteki klas z klasą, która ma dwie metody. Jedna metoda zgłasza wyjątek i obsługuje go, podczas gdy druga metoda zgłasza ten sam wyjątek, ale nie obsługuje go.
public class Class1 { public void ThrowHandledException() { try { throw new AccessViolationException(); } catch (AccessViolationException ave) { Console.WriteLine("caught exception" + ave.Message); } } public void ThrowUnhandledException() { throw new AccessViolationException(); } }
Oto metoda Main() aplikacji konsolowej:
static void Main(string[] args) { Class1 class1 = new Class1(); class1.ThrowHandledException(); class1.ThrowUnhandledException(); }
Jeśli w Ustawienia wyjątku jest zaewidencjonowany wyjątek AccessViolationException, wykonanie spowoduje przerwanie wykonywania w
throw
wierszu zarówno ThrowHandledException() jak i ThrowUnhandledException() podczas uruchamiania tego kodu w debugerze.
Aby przywrócić ustawienia wyjątku do ustawień domyślnych, wybierz przycisk Przywróć listę do ustawień domyślnych :
Poinformuj debuger o kontynuowaniu obsługi nieobsługiwanych wyjątków przez użytkownika
Jeśli debugujesz kod .NET lub JavaScript za pomocą polecenia Just My Code, możesz powiedzieć debugerowi, aby zapobiec przerwaniu w wyjątkach, które nie są obsługiwane w kodzie użytkownika, ale są obsługiwane gdzie indziej.
W oknie Ustawienia wyjątku otwórz menu skrótów, klikając prawym przyciskiem myszy etykietę kolumny, a następnie wybierz pozycję Pokaż kolumny > Dodatkowe akcje. (Jeśli wyłączono Po prostu Mój kod nie zobaczysz tego polecenia). Zostanie wyświetlona trzecia kolumna o nazwie Dodatkowe akcje .
W przypadku wyjątku, który pokazuje opcję Kontynuuj, gdy kod użytkownika nie jest obsługiwany w kodzie użytkownika w tej kolumnie, debuger kontynuuje działanie, jeśli ten wyjątek nie jest obsługiwany w kodzie użytkownika, ale jest obsługiwany zewnętrznie.
Aby zmienić to ustawienie dla określonego wyjątku, wybierz wyjątek, kliknij prawym przyciskiem myszy, aby wyświetlić menu skrótów, a następnie wybierz pozycję Kontynuuj, gdy nieobsługiwany w kodzie użytkownika. Można również zmienić ustawienie dla całej kategorii wyjątków, takich jak wszystkie wyjątki środowiska uruchomieniowego języka wspólnego).
Na przykład ASP.NET aplikacje internetowe obsługują wyjątki, konwertując je na kod stanu HTTP 500 (obsługa wyjątków w ASP.NET internetowym interfejsie API), co może nie pomóc w ustaleniu źródła wyjątku. W poniższym przykładzie kod użytkownika wywołuje metodę , która zgłasza FormatExceptionbłąd String.Format()
. Podziały wykonywania w następujący sposób:
Dodawanie i usuwanie wyjątków
Możesz dodawać i usuwać wyjątki. Aby usunąć typ wyjątku z kategorii, wybierz wyjątek, a następnie wybierz przycisk Usuń wybrany wyjątek z listy (znak minus) na pasku narzędzi Wyjątek Ustawienia. Możesz też kliknąć prawym przyciskiem myszy wyjątek i wybrać polecenie Usuń z menu skrótów. Usunięcie wyjątku ma taki sam efekt, jak w przypadku niezaznaczonego wyjątku, co oznacza, że debuger nie zostanie przerwany, gdy zostanie zgłoszony.
Aby dodać wyjątek:
W oknie Ustawienia wyjątku wybierz jedną z kategorii wyjątków (na przykład Środowisko uruchomieniowe języka wspólnego).
Wybierz przycisk Dodaj wyjątek do wybranej kategorii (znak plus).
Wpisz nazwę wyjątku (na przykład System.UriTemplateMatchException).
Wyjątek jest dodawany do listy (w kolejności alfabetycznej) i automatycznie sprawdzany.
Aby dodać wyjątek do wyjątków dostępu do pamięci procesora GPU, wyjątków środowiska uruchomieniowego JavaScript lub kategorii Wyjątki Win32, dołącz kod błędu i opis.
Napiwek
Sprawdź pisownię! Okno Wyjątek Ustawienia nie sprawdza istnienia dodanego wyjątku. Dlatego jeśli wpiszesz wartość Sytem.UriTemplateMatchException, otrzymasz wpis dla tego wyjątku (a nie dla wyjątku System.UriTemplateMatchException).
Ustawienia wyjątków są utrwalane w pliku .suo rozwiązania, dlatego mają zastosowanie do określonego rozwiązania. Nie można ponownie używać określonych ustawień wyjątków w rozwiązaniach. Teraz tylko dodane wyjątki są utrwalane; usunięte wyjątki nie są. Możesz dodać wyjątek, zamknąć i ponownie otworzyć rozwiązanie, a wyjątek będzie nadal istniał. Jeśli jednak usuniesz wyjątek i zamkniesz/ponownie otworzysz rozwiązanie, wyjątek pojawi się ponownie.
Okno Wyjątki Ustawienia obsługuje typy wyjątków ogólnych w języku C#, ale nie w Visual Basic. Aby przerwać wyjątki, takie jak MyNamespace.GenericException<T>
, należy dodać wyjątek jako MyNamespace.GenericException'1. Oznacza to, że jeśli utworzono wyjątek podobny do następującego kodu:
public class GenericException<T> : Exception
{
public GenericException() : base("This is a generic exception.")
{
}
}
Wyjątek można dodać do Ustawienia wyjątku, korzystając z poprzedniej procedury:
Dodawanie warunków do wyjątku
Użyj okna Ustawienia wyjątków, aby ustawić warunki dla wyjątków. Obecnie obsługiwane warunki obejmują nazwy modułów do uwzględnienia lub wykluczenia dla wyjątku. Ustawiając nazwy modułów jako warunki, można przerwać dla wyjątku tylko w niektórych modułach kodu. Możesz również unikać przerywania pracy z określonymi modułami.
Uwaga
Dodawanie warunków do wyjątku jest obsługiwane, począwszy od programu Visual Studio 2017.
Aby dodać wyjątki warunkowe:
Wybierz przycisk Edytuj warunki w oknie Ustawienia wyjątku lub kliknij prawym przyciskiem myszy wyjątek i wybierz polecenie Edytuj warunki.
Aby dodać dodatkowe wymagane warunki do wyjątku, wybierz pozycję Dodaj warunek dla każdego nowego warunku. Pojawią się dodatkowe wiersze warunku.
Dla każdego wiersza warunku wpisz nazwę modułu i zmień listę operatorów porównania na Equals lub Not Equals. Możesz określić symbole wieloznaczne (\*) w nazwie, aby określić więcej niż jeden moduł.
Jeśli musisz usunąć warunek, wybierz znak X na końcu wiersza warunku.