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ż