Составители:
Рубрика:
Диаграмма стека для инструкции leave:
... - >
Как видно из диаграммы, побочным эффектом при выполнении ин-
струкции leave является очистка стека вычислений.
Инструкция endfinally (см. таблицу 3.49) используется для выхода из
областей обработчиков без фильтрации. У нее есть псевдоним – endfault.
Таблица 3.49. Инструкция endfinally
Диаграмма стека для инструкции endfinally:
... - > ...
Инструкция endfilter (см. таблицу 3.50) завершает область фильтра.
Ее основная задача состоит в том, чтобы вернуть целое число (0 или 1).
Значение 0 означает, что данное исключение не может быть обработано и
нужно поискать другой обработчик. Значение 1 говорит о том, что нужно
передать управление на обработчик.
Таблица 3.50. Инструкция endfilter
Диаграмма стека для инструкции endfilter:
... , value -> ...
3.4.3. Правила размещения областей
Итак, в общем случае, предложение обработки исключений опреде-
ляет три области в коде метода: область защищенного блока, область
фильтра и область обработчика (фильтр может отсутствовать). Эти области
должны быть расположены в соответствии с определенными правилами:
1. Области, определяемые в предложении обработки исключений,
не могут перекрываться.
2. Область фильтра всегда расположена непосредственно перед
областью обработчика и завершается инструкцией endfilter.
3. Для любой пары предложений обработки исключений A и B
должно быть справедливо следующее:
Common Intermediate Language
121
Диаграмма стека для инструкции throw:
... , obj -> ...
Объектная ссылка, которую инструкция throw потребляет со стека
вычислений, должна указывать на объект в куче, описывающий исключе-
ние. Вообще говоря, в качестве такого объекта может выступать объект
любого типа, в том числе упакованный тип-значение, но спецификация
CLS требует, чтобы базовым классом для типа объекта-исключения являл-
ся класс System.Exception.
Если при выполнении инструкции throw на стеке вычислений
лежит нулевая ссылка, то генерируется исключение
System.NullReferenceException.
Инструкция rethrow (см. таблицу 3.47) разрешена только внутри обра-
ботчика исключений с фильтрацией по типу и предназначена для генерации
того же самого исключения, которое было поймано обработчиком.
Таблица 3.47. Инструкция rethrow
Диаграмма стека для инструкции rethrow:
... - > ...
3.4.2.2. Инструкции передачи управления между блоками
Инструкции, представленные в таблице 3.48, являются аналогами
инструкций безусловного перехода и используются для выхода из защи-
щенных областей и областей обработчиков с фильтрацией. Необходи-
мость существования этих инструкций обусловлена тем фактом, что обыч-
ные инструкции безусловного перехода не могут пересекать границы этих
областей.
Таблица 3.48. Инструкция leave
120
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0xFE 0x1A rethrow –Генерирует то же самое исклю-
чение, что было поймано обра-
ботчиком
Код Инструкция Встроенный Описание
операнд
0xDC endfinally – Выход из обработчиков finally и
(endfault) fault
Код Инструкция Встроенный Описание
операнд
0xFE 0x11 endfilter – Завершение области фильтра
Код Инструкция Встроенный Описание
операнд
0xDD leave int32 Выход из области
0xDE leave.s int8 Выход из области (короткий пе-
реход)
120 CIL и системное программирование в Microsoft .NET Common Intermediate Language 121 Диаграмма стека для инструкции throw: Диаграмма стека для инструкции leave: ... , obj -> ... ... -> Объектная ссылка, которую инструкция throw потребляет со стека Как видно из диаграммы, побочным эффектом при выполнении ин- вычислений, должна указывать на объект в куче, описывающий исключе- струкции leave является очистка стека вычислений. ние. Вообще говоря, в качестве такого объекта может выступать объект Инструкция endfinally (см. таблицу 3.49) используется для выхода из любого типа, в том числе упакованный тип-значение, но спецификация областей обработчиков без фильтрации. У нее есть псевдоним – endfault. CLS требует, чтобы базовым классом для типа объекта-исключения являл- ся класс System.Exception. Таблица 3.49. Инструкция endfinally Если при выполнении инструкции throw на стеке вычислений Код Инструкция Встроенный Описание лежит нулевая ссылка, то генерируется исключение System.NullReferenceException. операнд Инструкция rethrow (см. таблицу 3.47) разрешена только внутри обра- 0xDC endfinally – Выход из обработчиков finally и ботчика исключений с фильтрацией по типу и предназначена для генерации (endfault) fault того же самого исключения, которое было поймано обработчиком. Диаграмма стека для инструкции endfinally: Таблица 3.47. Инструкция rethrow ... -> ... Инструкция endfilter (см. таблицу 3.50) завершает область фильтра. Код Инструкция Встроенный Описание Ее основная задача состоит в том, чтобы вернуть целое число (0 или 1). операнд Значение 0 означает, что данное исключение не может быть обработано и нужно поискать другой обработчик. Значение 1 говорит о том, что нужно 0xFE 0x1A rethrow – Генерирует то же самое исклю- передать управление на обработчик. чение, что было поймано обра- ботчиком Таблица 3.50. Инструкция endfilter Диаграмма стека для инструкции rethrow: Код Инструкция Встроенный Описание ... -> ... операнд 0xFE 0x11 endfilter – Завершение области фильтра 3.4.2.2. Инструкции передачи управления между блоками Инструкции, представленные в таблице 3.48, являются аналогами Диаграмма стека для инструкции endfilter: инструкций безусловного перехода и используются для выхода из защи- ... , value -> ... щенных областей и областей обработчиков с фильтрацией. Необходи- мость существования этих инструкций обусловлена тем фактом, что обыч- 3.4.3. Правила размещения областей ные инструкции безусловного перехода не могут пересекать границы этих Итак, в общем случае, предложение обработки исключений опреде- областей. ляет три области в коде метода: область защищенного блока, область фильтра и область обработчика (фильтр может отсутствовать). Эти области Таблица 3.48. Инструкция leave должны быть расположены в соответствии с определенными правилами: Код Инструкция Встроенный Описание 1. Области, определяемые в предложении обработки исключений, не могут перекрываться. операнд 2. Область фильтра всегда расположена непосредственно перед 0xDD leave int32 Выход из области областью обработчика и завершается инструкцией endfilter. 0xDE leave.s int8 Выход из области (короткий пе- 3. Для любой пары предложений обработки исключений A и B реход) должно быть справедливо следующее:
Страницы
- « первая
- ‹ предыдущая
- …
- 65
- 66
- 67
- 68
- 69
- …
- следующая ›
- последняя »