Wyjątki i obsługa wyjątków (Przewodnik programowania w języku C#)Exceptions and Exception Handling (C# Programming Guide)

Funkcje C# obsługi wyjątków języka ułatwiają postępowanie z wszelkimi nieoczekiwanymi lub wyjątkowymi sytuacjami, które występują, gdy program jest uruchomiony.The C# language's exception handling features help you deal with any unexpected or exceptional situations that occur when a program is running. Obsługa wyjątków używa słów kluczowych try, catch i finally, aby wypróbować akcje, które mogą się nie powieść, aby obsłużyć błędy w przypadku podjęcia decyzji o tym, że jest to uzasadnione, i w celu późniejszego oczyszczenia zasobów.Exception handling uses the try, catch, and finally keywords to try actions that may not succeed, to handle failures when you decide that it is reasonable to do so, and to clean up resources afterward. Wyjątki mogą być generowane przez środowisko uruchomieniowe języka wspólnego (CLR) przez .NET Framework lub wszystkie biblioteki innych firm lub przez kod aplikacji.Exceptions can be generated by the common language runtime (CLR), by the .NET Framework or any third-party libraries, or by application code. Wyjątki są tworzone za pomocą słowa kluczowego throw.Exceptions are created by using the throw keyword.

W wielu przypadkach wyjątek może zostać wygenerowany nie przez metodę, którą kod został wywołany bezpośrednio, ale przez inną metodę w stosie wywołań.In many cases, an exception may be thrown not by a method that your code has called directly, but by another method further down in the call stack. Gdy tak się stanie, środowisko CLR spowoduje odwinięcie stosu, szukając metody z blokiem catch dla określonego typu wyjątku i wykona pierwszy taki blok catch, który zostanie znaleziony.When this happens, the CLR will unwind the stack, looking for a method with a catch block for the specific exception type, and it will execute the first such catch block that if finds. Jeśli nie znajdzie odpowiedniego bloku catch w dowolnym miejscu w stosie wywołań, zakończy proces i wyświetli komunikat dla użytkownika.If it finds no appropriate catch block anywhere in the call stack, it will terminate the process and display a message to the user.

W tym przykładzie metoda testów dla dzielenia przez zero i przechwytywania błędu.In this example, a method tests for division by zero and catches the error. Bez obsługi wyjątków ten program zostanie przerwany z powodu nieobsługiwanego błędu DivideByZeroException .Without the exception handling, this program would terminate with a DivideByZeroException was unhandled error.

class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new System.DivideByZeroException();
        return x / y;
    }
    static void Main()
    {
        // Input for test purposes. Change the values to see
        // exception handling behavior.
        double a = 98, b = 0;
        double result = 0;

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

Przegląd wyjątkówExceptions Overview

Wyjątki mają następujące właściwości:Exceptions have the following properties:

  • Wyjątki są typami, które ostatecznie pochodzą od System.Exception.Exceptions are types that all ultimately derive from System.Exception.
  • Użyj bloku try wokół instrukcji, które mogą zgłaszać wyjątki.Use a try block around the statements that might throw exceptions.
  • Gdy wystąpi wyjątek w bloku try, przepływ sterowania przechodzi do pierwszej powiązanej procedury obsługi wyjątku, która jest obecna w dowolnym miejscu w stosie wywołań.Once an exception occurs in the try block, the flow of control jumps to the first associated exception handler that is present anywhere in the call stack. W C#, słowo kluczowe catch służy do definiowania programu obsługi wyjątków.In C#, the catch keyword is used to define an exception handler.
  • Jeśli nie ma obsługi wyjątków dla danego wyjątku, program przestanie działać z komunikatem o błędzie.If no exception handler for a given exception is present, the program stops executing with an error message.
  • Nie należy przechwytywać wyjątku, chyba że można go obsłużyć i pozostawić aplikację w znanym stanie.Do not catch an exception unless you can handle it and leave the application in a known state. Jeśli przechwytujesz System.Exception, ponownie zgłoś go przy użyciu słowa kluczowego throw na końcu bloku catch.If you catch System.Exception, re-throw it using the throw keyword at the end of the catch block.
  • Jeśli blok catch definiuje zmienną wyjątku, można jej użyć, aby uzyskać więcej informacji na temat typu wyjątku, który wystąpił.If a catch block defines an exception variable, you can use it to obtain more information about the type of exception that occurred.
  • Wyjątki mogą być jawnie generowane przez program za pomocą słowa kluczowego throw.Exceptions can be explicitly generated by a program by using the throw keyword.
  • Obiekty wyjątków zawierają szczegółowe informacje o błędzie, takie jak stan stosu wywołań i opis tekstowy błędu.Exception objects contain detailed information about the error, such as the state of the call stack and a text description of the error.
  • Kod w bloku finally jest wykonywany nawet wtedy, gdy zostanie zgłoszony wyjątek.Code in a finally block is executed even if an exception is thrown. Użyj bloku finally do zwolnienia zasobów, na przykład aby zamknąć wszystkie strumienie lub pliki, które zostały otwarte w bloku try.Use a finally block to release resources, for example to close any streams or files that were opened in the try block.
  • Wyjątki zarządzane w .NET Framework są implementowane na podstawie mechanizmu obsługi wyjątków strukturalnych Win32.Managed exceptions in the .NET Framework are implemented on top of the Win32 structured exception handling mechanism. Aby uzyskać więcej informacji, zobacz strukturalna obsługa wyjątków (C++C/) i kurs awarii na głębokości obsługi wyjątków strukturalnych Win32.For more information, see Structured Exception Handling (C/C++) and A Crash Course on the Depths of Win32 Structured Exception Handling.

Więcej informacji o wyjątkach i obsłudze wyjątków można znaleźć w następujących artykułach:See the following articles for more information about exceptions and exception handling:

Specyfikacja języka C#C# Language Specification

Aby uzyskać więcej informacji, zobacz wyjątki w C# specyfikacji języka.For more information, see Exceptions in the C# Language Specification. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.The language specification is the definitive source for C# syntax and usage.

Zobacz takżeSee also