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 try
słów kluczowych , catch
i 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.Exception
klasy . 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ęzykucatch
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.Exception
element , ponownie użyj słowa kluczowegothrow
catch
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 wtry
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#.