Исключения и обработка исключений (Руководство по программированию в C#)Exceptions and Exception Handling (C# Programming Guide)

Функции обработки исключений в языке C# помогают вам справиться с непредвиденными или исключительными проблемами, которые возникают при выполнении программы.The C# language's exception handling features help you deal with any unexpected or exceptional situations that occur when a program is running. Обработка исключений использует ключевые слова try, catch и finally для действий, которые могут оказаться неудачными. Это позволяет обрабатывать ошибки так, как кажется разумным, а также правильно высвобождать ресурсы.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. Исключения могут создаваться средой выполнения (CLR), платформой .NET Framework, библиотеками сторонних поставщиков или кодом самого приложения.Exceptions can be generated by the common language runtime (CLR), by the .NET Framework or any third-party libraries, or by application code. Чтобы создать исключение, используйте ключевое слово throw.Exceptions are created by using the throw keyword.

Во многих случаях исключение может создаваться не тем методом, который вызывается в вашем коде, а одним из последующих методов в стеке вызовов.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. В этом случае среда CLR разворачивает весь стек в поисках метода с блоком catch для исключений соответствующего типа, и выполняет первый обнаруженный блок catch подходящего вида.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. Если подходящий блок catch не будет обнаружен во всем стеке вызовов, среда CLR завершает процесс и выводит сообщение для пользователя.If it finds no appropriate catch block anywhere in the call stack, it will terminate the process and display a message to the user.

В этом примере метод выполняет проверку деления на нуль и перехватывает ошибку.In this example, a method tests for division by zero and catches the error. Если не использовать обработку исключений, такая программа завершит работу с ошибкой DivideByZeroException was unhandled (Исключение DivideByZero не обработано).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.");
        }
    }
}

Общие сведения об исключенияхExceptions Overview

Исключения имеют следующие свойства.Exceptions have the following properties:

  • Исключения представляют собой типы, производные в конечном счете от System.Exception.Exceptions are types that all ultimately derive from System.Exception.

  • Используйте блок try для выполнения таких инструкций, которые могут создавать исключения.Use a try block around the statements that might throw exceptions.

  • Когда внутри такого блока try возникает исключение, поток управления переходит к первому подходящему обработчику исключений в стеке вызовов.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. В C# ключевое слово catch обозначает обработчик исключений.In C#, the catch keyword is used to define an exception handler.

  • Если для созданного исключения не существует обработчиков, выполнение программы прекращается с сообщением об ошибке.If no exception handler for a given exception is present, the program stops executing with an error message.

  • Не перехватывайте исключение, если вы не намерены его обрабатывать с сохранением известного состояния приложения.Do not catch an exception unless you can handle it and leave the application in a known state. Если вы перехватываете System.Exception, создайте его заново в конце блока catch, используя ключевое слово throw.If you catch System.Exception, rethrow it using the throw keyword at the end of the catch block.

  • Если блок catch определяет переменную исключения, ее можно использовать для получения дополнительных сведений о типе созданного исключения.If a catch block defines an exception variable, you can use it to obtain more information about the type of exception that occurred.

  • Программа может явным образом создавать исключения с помощью ключевого слова throw.Exceptions can be explicitly generated by a program by using the throw keyword.

  • Объекты исключения содержат подробные сведения об ошибке, например состояние стека вызовов и текстовое описание ошибки.Exception objects contain detailed information about the error, such as the state of the call stack and a text description of the error.

  • Код в блоке finally выполняется даже в том случае, если создано исключение.Code in a finally block is executed even if an exception is thrown. Используйте блок finally, чтобы высвободить ресурсы, например закрыть потоки и файлы, которые были открыты внутри блока try.Use a finally block to release resources, for example to close any streams or files that were opened in the try block.

  • Управляемые исключения реализованы в платформе .NET Framework на основе структурированного механизма обработки исключений Win32.Managed exceptions in the .NET Framework are implemented on top of the Win32 structured exception handling mechanism. Дополнительные сведения см. в статьях Structured Exception Handling (C/C++) (Структурированная обработка исключений в C и C++) и A Crash Course on the Depths of Win32 Structured Exception Handling (Интенсивное погружение в структурированную обработку исключений на платформе Win32).For more information, see Structured Exception Handling (C/C++) and A Crash Course on the Depths of Win32 Structured Exception Handling.

Дополнительные сведения об исключениях и обработке исключений вы найдете в следующих статьях:See the following topics for more information about exceptions and exception handling:

Спецификация языка C#C# Language Specification

Дополнительные сведения см. в разделе Исключения в Спецификации языка C#.For more information, see Exceptions in the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee also