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.

Screenshot of Exception Settings check box.

Screenshot of Exception Settings check box.

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 :

Screenshot of Restore Defaults in Exception Settings.

Screenshot of Restore Defaults in Exception Settings.

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.

  1. 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 .

    Screenshot of Additional Actions column.

    Screenshot of Additional Actions column.

    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.

  2. 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).

    Screenshot of Continue when unhandled in user code setting.

    Screenshot of Continue when unhandled in user code setting.

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:

Breaks on user-unhandled exception

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:

  1. W oknie Ustawienia wyjątku wybierz jedną z kategorii wyjątków (na przykład Środowisko uruchomieniowe języka wspólnego).

  2. Wybierz przycisk Dodaj wyjątek do wybranej kategorii (znak plus).

    Screenshot of Add an exception to the selected category button.

    Screenshot of Add an exception to the selected category button.

  3. Wpisz nazwę wyjątku (na przykład System.UriTemplateMatchException).

    Screenshot of Type exception name.

    Screenshot of Type exception name.

    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:

Screenshot of Add generic exception.

Screenshot of Add generic exception.

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:

  1. Wybierz przycisk Edytuj warunki w oknie Ustawienia wyjątku lub kliknij prawym przyciskiem myszy wyjątek i wybierz polecenie Edytuj warunki.

    Screenshot of exception conditions.

  2. Aby dodać dodatkowe wymagane warunki do wyjątku, wybierz pozycję Dodaj warunek dla każdego nowego warunku. Pojawią się dodatkowe wiersze warunku.

    Screenshot of extra conditions for an exception.

  3. 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ł.

  4. Jeśli musisz usunąć warunek, wybierz znak X na końcu wiersza warunku.