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


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

Обновлен: Ноябрь 2007

Исключение — это любое ошибочное условие или непредвиденное поведение, с которым сталкивается программа в процессе выполнения. Исключения могут возникать вследствие сбоя в вашем коде или в вызванном коде (таком как общая библиотека), недоступности ресурсов операционной системы, неожиданных условий, с которыми сталкивается общеязыковая среда выполнения (такими как код, который не может быть проверен), и т. д. При возникновении некоторых из этих условий приложение пользователя может выполнить восстановление самостоятельно, однако это возможно не всегда. Восстановление возможно для большинства случаев исключений приложений, но оно невозможно для подавляющей части исключений среды выполнения.

В платформе .NET Framework исключение - это объект, перенимаемый от класса Exception Class. Исключение посылается из области кода, где возникла проблема. Исключение передается в стек до тех пор, пока его не обработает приложение или не завершится выполнение программы. Дополнительные сведения по обработке исключений с помощью платформы .NET Framework содержатся в разделе Класс исключений.

Управление исключениями средой выполнения

Среда выполнения использует модель обработки исключений, основанную на объектах исключения и защищенных блоках кода. Объект Exception создается для представления исключения при его возникновении.

Для каждого выполняемого кода среда выполнения создает таблицу сведений об исключениях. Для каждого метода выполнения имеется связанный с ним массив информации по обработке исключений (который может быть и пустым) в таблице сведений об исключениях. Каждая запись массива описывает защищенный блок кода, любые фильтры исключений, связанные с этим кодом, и любых обработчиков исключений (операторы перехвата). Применение этой таблицы исключений весьма результативно, так как при отсутствии исключения не происходит снижения производительности процессора или неэффективного использования памяти. Ресурсы используются только при возникновении исключения.

Таблица сведений об исключении отображает четыре типа обработчиков исключений для защищенных блоков.

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

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

  • Обработчик с фильтрацией по типу обрабатывает любое исключение заданного класса или любого из производных этого класса.

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

Каждый язык реализует такие обработчики исключений в соответствии с его спецификациями. Например, Visual Basic 2005 предоставляет доступ к обработчику с пользовательской фильтрацией посредством сравнения переменных (с использованием зарезервированного слова When) в операторе перехвата; C# не реализует обработчик с пользовательской фильтрацией.

При возникновении исключения среда выполнения начинает исполнение процесса, состоящего из двух шагов:

  1. Среда выполнения производит поиск массива для первого защищенного блока, в котором:

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

    • содержится обработчик исключения или фильтр для обработки этого исключения.

  2. Если массив найден, среда выполнения создает объект Exception, описывающий данное исключение. Затем среда выполнения исполняет все завершающие действия или сбойные операторы, находящиеся между оператором, в котором возникло исключение, и оператором обработки этого исключения. Обратите внимание, что важен порядок обработчиков исключений: первым определяется внутренний обработчик. Обратите внимание, что обработчики исключений могут получать доступ к локальным переменным и локальной памяти программы, перехватывающей исключение, но любые промежуточные значения на момент инициации исключения теряются.

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

Фильтрация исключений среды выполнения

Перехватываемые и обрабатываемые исключения можно отфильтровать либо по типу, либо по некоторым критериям, определяемым пользователем.

Обработчики с фильтрацией по типу обрабатывают определенный тип исключения (или производные из этого типа классы). Наиболее распространенная форма обработчика исключения с фильтрацией по типу задает перехват только определенного класса исключений.

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

Catch e As FileNotFoundException
   Console.WriteLine("[Data File Missing] {0}", e)
catch(FileNotFoundException e) {
    Console.WriteLine("[Data File Missing] {0}", e);
}

Обработчики с пользовательской фильтрацией перехватывают и обрабатывают исключения на основе требований к исключению, определяемых пользователем. Эти обработчики используют оператор Catch с ключевым словом When в Visual Basic 2005. Сведения о таком способе фильтрации исключений содержатся в разделе Использование определенных исключений в блоке Catch.

См. также

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

Класс Exception и его свойства

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

Лучшие методики обработки исключений

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

Основы обработки исключений

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