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

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

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

Инструкции CIL для обработки исключений

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

Инструкции для генерации исключений

Инструкция throw (см. таблицу 3.46) генерирует исключение, включая тем самым механизм обработки исключений.

Таблица 3.46. Инструкция throw
Код Инструкция Встроенный операнд Описание
0x7A throw - Генерирует исключение

Диаграмма стека для инструкции throw:

... , obj -> ...

Объектная ссылка, которую инструкция throw потребляет со стека вычислений, должна указывать на объект в куче, описывающий исключение. Вообще говоря, в качестве такого объекта может выступать объект любого типа, в том числе упакованный тип-значение, но спецификация CLS требует, чтобы базовым классом для типа объекта-исключения являлся класс System.Exception.

Если при выполнении инструкции throw на стеке вычислений лежит нулевая ссылка, то генерируется исключение System.NullReferenceException.

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

Таблица 3.47. Инструкция rethrow
Код Инструкция Встроенный операнд Описание
0xFE 0x1A rethrow - Генерирует то же самое исключение, что было поймано обработчиком

Диаграмма стека для инструкции rethrow:

... -> ...
Инструкции передачи управления между блоками

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

Таблица 3.48. Инструкция leave
Код Инструкция Встроенный операнд Описание
0xDD leave int32 Выход из области
0xDE leave.s int8 Выход из области (короткий период)

Диаграмма стека для инструкции leave:

... ->

Как видно из диаграммы, побочным эффектом при выполнении инструкции leave является очистка стека вычислений.

Инструкция endfinally (см. таблицу 3.49) используется для выхода из областей обработчиков без фильтрации. У нее есть псевдоним - endfault.

Таблица 3.49. Инструкция endfinally
Код Инструкция Встроенный операнд Описание
0xDC endfinally (endfault) - Выход из обработчиков finally и fault

Диаграмма стека для инструкции endfinally:

... -> ...

Инструкция endfilter (см. таблицу 3.50) завершает область фильтра. Ее основная задача состоит в том, чтобы вернуть целое число (0 или 1). Значение 0 означает, что данное исключение не может быть обработано и нужно поискать другой обработчик. Значение 1 говорит о том, что нужно передать управление на обработчик.

Таблица 3.50. Инструкция endfilter
Код Инструкция Встроенный операнд Описание
0xFE 0x11 endfilter - Завершение области фильтра

Диаграмма стека для инструкции endfilter:

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