Udostępnij za pośrednictwem


Wyjątki i obsługa wyjątków

Funkcje obsługi wyjątków języka C# ułatwiają radzenie sobie z nieoczekiwanymi lub wyjątkowymi sytuacjami, które występują, gdy program jest uruchomiony. Obsługa wyjątków używa słów kluczowych try, catch i finally do wykonywania działań, które mogą się nie powieść, do radzenia sobie z niepowodzeniami, gdy uznasz to za zasadne, oraz do oczyszczania zasobów później. Wyjątki mogą być generowane przez środowisko uruchomieniowe języka wspólnego (CLR), biblioteki platformy .NET lub innych firm lub kod aplikacji. Wyjątki są tworzone przy użyciu słowa kluczowego throw .

W wielu przypadkach wyjątek może być zgłaszany nie przez metodę wywoływaną bezpośrednio przez kod, ale przez inną metodę dalej w stosie wywołań. Po wystąpieniu wyjątku clR rozwinie stos, wyszukuje metodę z blokiem catch dla określonego typu wyjątku i wykona pierwszy taki catch blok, który znajdzie. Jeśli nie znajdzie odpowiedniego catch bloku w dowolnym miejscu w stosie wywołań, zakończy proces i wyświetli komunikat dla użytkownika.

W tym przykładzie metoda testuje dzielenie według zera i przechwytuje błąd. Bez obsługi wyjątków ten program zakończyłby się z błędem DivideByZeroException, który nie został obsłużony.

public class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new DivideByZeroException();
        return x / y;
    }

    public static void Main()
    {
        // Input for test purposes. Change the values to see
        // exception handling behavior.
        double a = 98, b = 0;
        double result;

        try
        {
            result = SafeDivision(a, b);
            Console.WriteLine($"{a} divided by {b} = {result}");
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

Omówienie wyjątków

Wyjątki mają następujące właściwości:

  • Wyjątki to typy, które ostatecznie pochodzą z klasy System.Exception.
  • Użyj bloku try wokół instrukcji, które mogą zgłaszać wyjątki.
  • Po wystąpieniu wyjątku w bloku try, przepływ kontroli przechodzi do pierwszego skojarzonego programu obsługi wyjątków, który znajduje się w dowolnym miejscu w stosie wywołań. W języku catch C#słowo kluczowe jest używane do definiowania procedury obsługi wyjątków.
  • Jeśli nie ma programu obsługi wyjątków dla danego wyjątku, program zatrzymuje wykonywanie z komunikatem o błędzie.
  • Nie przechwytuj wyjątku, chyba że możesz go obsłużyć i pozostawić aplikację w opisanym stanie. Jeśli przechwycisz System.Exception, rzuć go ponownie, używając słowa kluczowego throw na końcu bloku catch.
  • catch Jeśli blok definiuje zmienną wyjątku, możesz jej użyć, aby uzyskać więcej informacji o typie wyjątku, który wystąpił.
  • Wyjątki mogą być jawnie generowane przez program przy użyciu słowa kluczowego throw .
  • Obiekty wyjątków zawierają szczegółowe informacje o błędzie, takie jak stan stosu wywołań i opis tekstu błędu.
  • Kod w finally bloku jest wykonywany niezależnie od tego, czy jest zgłaszany wyjątek. Użyj bloku finally, aby zwolnić zasoby, na przykład zamknąć wszystkie strumienie lub pliki, które zostały otwarte w bloku try.
  • Wyjątki zarządzane na platformie .NET są implementowane na podstawie mechanizmu obsługi wyjątków strukturalnych Win32. Aby uzyskać więcej informacji, zobacz Obsługa wyjątków ustrukturyzowanych (C/C++) oraz Podstawy obsługi wyjątków ustrukturyzowanych w systemie Win32.

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Wyjątki w specyfikacji języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Zobacz też