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 trysłów kluczowych , catchi finally do wypróbowania akcji, które mogą się nie powieść, do obsługi błędów, gdy zdecydujesz, że jest to uzasadnione i czyścić zasoby później. Wyjątki mogą być generowane przez środowisko uruchomieniowe języka wspólnego (CLR), biblioteki platformy .NET lub innych firm albo kod aplikacji. Wyjątki są tworzone przy użyciu słowa kluczowego throw .

W wielu przypadkach wyjątek może zostać zgłoszony nie przez metodę wywoływaną bezpośrednio przez kod, ale przez inną metodę dalej w stosie wywołań. Gdy zgłaszany jest wyjątek, clR odwije stos, szuka metody 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 użytkownikowi komunikat.

W tym przykładzie metoda testuje dzielenie przez zero i przechwytuje błąd. Bez obsługi wyjątków ten program zakończy się błędem DivideByZeroException .

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("{0} divided by {1} = {2}", a, 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 System.Exceptionklasy .
  • try Użyj bloku wokół instrukcji, które mogą zgłaszać wyjątki.
  • Po wystąpieniu wyjątku try w bloku przepływ sterowania 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 programu obsługi wyjątków.
  • Jeśli nie ma programu obsługi wyjątków dla danego wyjątku, program przestanie wykonywać działanie z komunikatem o błędzie.
  • Nie przechwyć wyjątku, chyba że możesz go obsłużyć i pozostawić aplikację w znanym stanie. Jeśli przechwycisz System.Exceptionelement , ponownie użyj słowa kluczowego throwcatch na końcu bloku.
  • catch Jeśli blok definiuje zmienną wyjątku, możesz użyć jej do uzyskania dodatkowych informacji o typie wyjątku, który wystąpił.
  • Wyjątki mogą być generowane jawnie 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 tekstowy błędu.
  • Kod w finally bloku jest wykonywany niezależnie od tego, czy jest zgłaszany wyjątek. finally Użyj bloku, aby zwolnić zasoby, na przykład, aby zamknąć wszystkie strumienie lub pliki, które zostały otwarte w try bloku.
  • Zarządzane wyjątki na platformie .NET są implementowane na podstawie mechanizmu obsługi wyjątków strukturalnych Win32. Aby uzyskać więcej informacji, zobacz Structured Exception Handling (C/C++) i A Crash Course on the Depths of Win32 Structured Exception Handling (Obsługa wyjątków strukturalnych 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ż