Поделиться через


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

Функции обработки исключений на языке 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 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.");
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

Связанные разделы

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

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

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

См. также

Ссылки

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

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

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

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

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

SystemException

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

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

Иерархия исключений

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

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

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

Minidumps для конкретных исключений