Рабочим названием платформы .NET было |
Язык CIL: обработка исключений. Синтаксис ILASM
Инструкции CIL для обработки исключений
В CIL предусмотрено несколько инструкций, отвечающих за порождение исключений и передачу управления из обработчиков исключений.
Инструкции для генерации исключений
Инструкция throw (см. таблицу 3.46) генерирует исключение, включая тем самым механизм обработки исключений.
Код | Инструкция | Встроенный операнд | Описание |
---|---|---|---|
0x7A | throw | - | Генерирует исключение |
Диаграмма стека для инструкции throw:
... , obj -> ...
Объектная ссылка, которую инструкция throw потребляет со стека вычислений, должна указывать на объект в куче, описывающий исключение. Вообще говоря, в качестве такого объекта может выступать объект любого типа, в том числе упакованный тип-значение, но спецификация CLS требует, чтобы базовым классом для типа объекта-исключения являлся класс System.Exception.
Если при выполнении инструкции throw на стеке вычислений лежит нулевая ссылка, то генерируется исключение System.NullReferenceException.
Инструкция rethrow (см. таблицу 3.47) разрешена только внутри обработчика исключений с фильтрацией по типу и предназначена для генерации того же самого исключения, которое было поймано обработчиком.
Код | Инструкция | Встроенный операнд | Описание |
---|---|---|---|
0xFE 0x1A | rethrow | - | Генерирует то же самое исключение, что было поймано обработчиком |
Диаграмма стека для инструкции rethrow:
... -> ...
Инструкции передачи управления между блоками
Инструкции, представленные в таблице 3.48, являются аналогами инструкций безусловного перехода и используются для выхода из защищенных областей и областей обработчиков с фильтрацией. Необходимость существования этих инструкций обусловлена тем фактом, что обычные инструкции безусловного перехода не могут пересекать границы этих областей.
Код | Инструкция | Встроенный операнд | Описание |
---|---|---|---|
0xDD | leave | int32 | Выход из области |
0xDE | leave.s | int8 | Выход из области (короткий период) |
Диаграмма стека для инструкции leave:
... ->
Как видно из диаграммы, побочным эффектом при выполнении инструкции leave является очистка стека вычислений.
Инструкция endfinally (см. таблицу 3.49) используется для выхода из областей обработчиков без фильтрации. У нее есть псевдоним - endfault.
Код | Инструкция | Встроенный операнд | Описание |
---|---|---|---|
0xDC | endfinally (endfault) | - | Выход из обработчиков finally и fault |
Диаграмма стека для инструкции endfinally:
... -> ...
Инструкция endfilter (см. таблицу 3.50) завершает область фильтра. Ее основная задача состоит в том, чтобы вернуть целое число (0 или 1). Значение 0 означает, что данное исключение не может быть обработано и нужно поискать другой обработчик. Значение 1 говорит о том, что нужно передать управление на обработчик.
Код | Инструкция | Встроенный операнд | Описание |
---|---|---|---|
0xFE 0x11 | endfilter | - | Завершение области фильтра |
Диаграмма стека для инструкции endfilter:
... , value -> ...