Опубликован: 28.06.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный технический университет им. Н.Э. Баумана
Лекция 7:

Язык CIL: обработка исключений. Синтаксис ILASM

< Лекция 6 || Лекция 7: 123456 || Лекция 8 >

Правила размещения областей

Итак, в общем случае, предложение обработки исключений определяет три области в коде метода: область защищенного блока, область фильтра и область обработчика (фильтр может отсутствовать). Эти области должны быть расположены в соответствии с определенными правилами:

  1. Области, определяемые в предложении обработки исключений, не могут перекрываться.
  2. Область фильтра всегда расположена непосредственно перед областью обработчика и завершается инструкцией endfilter.
  3. Для любой пары предложений обработки исключений A и B должно быть справедливо следующее:
    • если защищенная область предложения A находится внутри защищенной области предложения B, то области фильтра и обработчика предложения A также должны располагаться внутри защищенной области предложения B;
    • если защищенная область предложения A не пересекается с защищенной областью предложения B, то области фильтров и обработчиков этих предложений тоже не должны пересекаться;
    • если защищенная область предложения A совпадает с защищенной областью предложения B, то области фильтров и обработчиков этих предложений не должны пересекаться.

Ограничения на передачу управления

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

  1. Передача управления на обработчики осуществляется только через механизм обработки исключений.
  2. Существует только два способа передать управление извне на защищенную область:
    • передача управления на первую инструкцию защищенной области;
    • использование инструкции leave из области обработчика с фильтрацией, связанной с данной защищенной областью (область обработки связана с защищенной областью, если их координаты указаны в одном и том же предложении обработки исключений).
  3. Перед входом в защищенную область стек вычислений должен быть пустым.
  4. Для выхода из защищенной области, из области фильтра или из области обработчика существуют только следующие возможности:
    • порождение исключения инструкцией throw ;
    • использование инструкции leave из защищенной области или области с фильтрацией;
    • использование инструкции endfilter из области фильтра;
    • использование инструкции endfinally из области без фильтрации;
    • использование инструкции rethrow из области с фильтрацией.

Семантика обработки исключений

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

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

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

  1. оно описывает обработчик с фильтрацией;
  2. адрес инструкции, породившей исключение, попадает в диапазон адресов защищенной области этого предложения;
  3. исключение удовлетворяет фильтру обработчика.

Таким образом, на первом этапе finally и fault-блоки пропускаются. Кроме того, происходит последовательный вызов фильтров для блоков с пользовательской фильтрацией.

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

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

В первом случае система переходит к следующему этапу, а во втором - выполнение программы аварийно завершается.

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

< Лекция 6 || Лекция 7: 123456 || Лекция 8 >
Анастасия Булинкова
Анастасия Булинкова
Рабочим названием платформы .NET было
Bogdan Drumov
Bogdan Drumov
Молдова, Республика
Azamat Nurmanbetov
Azamat Nurmanbetov
Киргизия, Bishkek