Исключения и обработка исключений (руководство по программированию в C#)

Обновлен: Июль 2008

Функции обработки исключений на языке C# помогают обрабатывать любые непредвиденные или исключительные ситуации, происходящие при выполнении программы. При обработке исключений используются ключевые слова try, catch и finally для попыток применения действий, которые могут не достичь успеха, для обработки ошибок, если предполагается, что это может быть разумным, и для последующего освобождения ресурсов. Исключения могут генерироваться средой CLR, платформой .NET Framework или внешними библиотеками, либо кодом приложения. Исключения создаются при помощи ключевого слова throw.

Во многих случаях исключение может инициироваться не методом, вызванным непосредственно кодом, а другим методом, расположенным ниже в стеке вызовов. Когда это происходит, среда CLR выполняет откат стека в поисках метода с блоком catch для определенного типа исключения. При обнаружении первого такого блока catch этот блок выполняется. Если среда CLR не находит соответствующего блока catch где-либо в стеке вызовов, она завершает процесс и отображает пользователю сообщение.

В этом примере метод тестирует деление на ноль и выполняет перехват соответствующей ошибки. Без обработки исключений эта программа была бы завершена с ошибкой DivideByZeroException was unhandled (не обработано исключение "деление на ноль").

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 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.");
        }
    }
}

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

Исключения имеют следующие свойства.

  • Исключения имеют типы, в конечном счете являющиеся производными от System.Exception.

  • Следует использовать блок try для заключения в него инструкций, которые могут выдать исключения.

  • При возникновении исключения в блоке try поток управления немедленно переходит к первому соответствующему обработчику исключений, присутствующему в стеке вызовов. В языке C# ключевое слово catch используется для определения обработчика исключений.

  • Если обработчик для определенного исключения не существует, выполнение программы завершается с сообщением об ошибке.

  • Не перехватывайте исключение, если его нельзя обработать, и оставьте приложение в известном состоянии. При перехвате System.Exception вновь инициируйте это исключение с использованием ключевого слова throw в конце блока catch.

  • Если в блоке catch определяется переменная исключения, ее можно использовать для получения дополнительной информации о типе произошедшего исключения.

  • Исключения могут явно генерироваться программной с помощью ключевого слова throw.

  • Объекты исключения содержат подробные сведения об ошибке, такие как состояние стека вызовов и текстовое описание ошибки.

  • Код в блоке finally выполняется, даже при возникновении исключения. Блок finally используется для освобождения ресурсов, например для закрытия потоков или файлов, открытых в блоке try.

  • Управляемые исключения в платформе .NET Framework реализуются в начале механизма структурированной обработки исключений Win32. Дополнительные сведения см. в разделе Structured Exception Handling (C++) и в документе Подробное руководство по структурированной обработке исключений Win32.

Разделы по теме

Дополнительные сведения об исключениях и обработке исключений см. в следующих разделах:

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

Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:

  • 8.9.5 Оператор throw

  • 8.10 Инструкция try

  • 16 Исключения

См. также

Основные понятия

Руководство по программированию в C#

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

Ссылки

Ключевые слова C#

throw (Справочник по C#)

try-catch (Справочник по C#)

try-finally (Справочник по C#)

try-catch-finally (Справочник по C#)

Другие ресурсы

Правила разработки исключений

Обработка и создание исключений

Написание надежного .NET-кода

Журнал изменений

Дата

Журнал изменений

Причина

Июль 2008

Изменен пример кода и добавлен текст о раскрутке стека.

Исправление ошибки содержимого.

Июль 2008

Добавлено объяснение блока finally.

Улучшение информации.

Июль 2008

Добавлены сведения о механизме структурированной обработки исключений Win32.

Улучшение информации.