Составители:
Рубрика:
щихся друг от друга тем, по каким критериям принимается решение о пе-
редаче на них управления:
1. Обработчик с фильтрацией по типу.
Получает управление, если тип исключения совместим по при-
сваиванию с типом, указанным в поле ClassToken предложения
обработки исключений.
2. Обработчик с пользовательской фильтрацией.
Решение о том, получит или не получит управление обработчик,
принимает код, содержащийся в области фильтра.
3. Обработчик finally.
Вызывается при выходе из защищенной области, независимо от
того, было или не было сгенерировано исключение.
4. Обработчик fault.
Вызывается, если внутри защищенной области было сгенериро-
вано любое исключение.
Таблица 3.45. Допустимые значения поля Flags предложения обработ-
ки исключений
Первые два типа обработчиков мы будем относить к категории обра-
ботчиков с фильтрацией, а последние два – к категории обработчиков без
фильтрации.
3.4.2. Инструкции CIL для обработки исключений
В CIL предусмотрено несколько инструкций, отвечающих за порож-
дение исключений и передачу управления из обработчиков исключений.
3.4.2.1. Инструкции для генерации исключений
Инструкция throw (см. таблицу 3.46) генерирует исключение, вклю-
чая тем самым механизм обработки исключений.
Таблица 3.46. Инструкция throw
Common Intermediate Language
119
не любые, а укладывающиеся в 32 бита. Но на практике этого более чем
достаточно.
Таблица 3.43. Поля предложения обработки исключений в случае
короткого формата
Таблица 3.44. Поля предложения обработки исключений в случае
длинного формата
Итак, координаты защищенной области задаются парой (TryOffset,
TryLength), а координаты области обработчика – парой (HandlerOffset,
HandlerLength). Для области фильтра указывается только ее смещение, по-
тому что подразумевается, что она непосредственно предшествует области
обработчика (длину области фильтра можно вычислить: она равна
HandlerOffset – FilterOffset).
Обратите внимание, что смещения полей ClassToken и FilterOffset
совпадают. Это означает, что фактически они представляют собой одно
поле. Просто иногда оно интерпретируется как токен метаданных, а ино-
гда – как смещение области фильтра.
Поле Flags, возможные значения которого перечислены в таблице
3.45, задает тип обработчика.
Всего возможны четыре типа обработчиков исключений, отличаю-
118
CIL и системное программирование в Microsoft .NET
Смещение Размер Поле Описание
02Flags Флаги
22TryOffset Координаты защищенной
41TryLength области
52HandlerOffset Координаты области
71HandlerLength обработчика
84ClassToken Токен метаданных
84FilterOffset Смещение области фильтра
Смещение Размер Поле Описание
04Flags Флаги
44TryOffset Координаты защищенной
84TryLength области
12 4 HandlerOffset Координаты области
16 4 HandlerLength обработчика
20 4 ClassToken Токен метаданных
20 4 FilterOffset Смещение области фильтра
Значение Описание
0 Обработчик исключений с фильтрацией по типу
1 Обработчик исключений с пользовательской фильтрацией
2 Обработчик finally
4 Обработчик fault
Код Инструкция Встроенный Описание
операнд
0x7A throw –Генерирует исключение
118 CIL и системное программирование в Microsoft .NET Common Intermediate Language 119 не любые, а укладывающиеся в 32 бита. Но на практике этого более чем щихся друг от друга тем, по каким критериям принимается решение о пе- достаточно. редаче на них управления: 1. Обработчик с фильтрацией по типу. Таблица 3.43. Поля предложения обработки исключений в случае Получает управление, если тип исключения совместим по при- короткого формата сваиванию с типом, указанным в поле ClassToken предложения обработки исключений. Смещение Размер Поле Описание 2. Обработчик с пользовательской фильтрацией. 0 2 Flags Флаги Решение о том, получит или не получит управление обработчик, 2 2 TryOffset Координаты защищенной принимает код, содержащийся в области фильтра. 4 1 TryLength области 3. Обработчик finally. 5 2 HandlerOffset Координаты области Вызывается при выходе из защищенной области, независимо от того, было или не было сгенерировано исключение. 7 1 HandlerLength обработчика 4. Обработчик fault. 8 4 ClassToken Токен метаданных Вызывается, если внутри защищенной области было сгенериро- 8 4 FilterOffset Смещение области фильтра вано любое исключение. Таблица 3.44. Поля предложения обработки исключений в случае Таблица 3.45. Допустимые значения поля Flags предложения обработ- длинного формата ки исключений Смещение Размер Поле Описание Значение Описание 0 4 Flags Флаги 0 Обработчик исключений с фильтрацией по типу 4 4 TryOffset Координаты защищенной 1 Обработчик исключений с пользовательской фильтрацией 8 4 TryLength области 2 Обработчик finally 12 4 HandlerOffset Координаты области 4 Обработчик fault 16 4 HandlerLength обработчика Первые два типа обработчиков мы будем относить к категории обра- 20 4 ClassToken Токен метаданных ботчиков с фильтрацией, а последние два – к категории обработчиков без 20 4 FilterOffset Смещение области фильтра фильтрации. Итак, координаты защищенной области задаются парой (TryOffset, 3.4.2. Инструкции CIL для обработки исключений TryLength), а координаты области обработчика – парой (HandlerOffset, В CIL предусмотрено несколько инструкций, отвечающих за порож- HandlerLength). Для области фильтра указывается только ее смещение, по- дение исключений и передачу управления из обработчиков исключений. тому что подразумевается, что она непосредственно предшествует области обработчика (длину области фильтра можно вычислить: она равна 3.4.2.1. Инструкции для генерации исключений HandlerOffset – FilterOffset). Инструкция throw (см. таблицу 3.46) генерирует исключение, вклю- Обратите внимание, что смещения полей ClassToken и FilterOffset чая тем самым механизм обработки исключений. совпадают. Это означает, что фактически они представляют собой одно поле. Просто иногда оно интерпретируется как токен метаданных, а ино- Таблица 3.46. Инструкция throw гда – как смещение области фильтра. Поле Flags, возможные значения которого перечислены в таблице Код Инструкция Встроенный Описание 3.45, задает тип обработчика. операнд Всего возможны четыре типа обработчиков исключений, отличаю- 0x7A throw – Генерирует исключение
Страницы
- « первая
- ‹ предыдущая
- …
- 64
- 65
- 66
- 67
- 68
- …
- следующая ›
- последняя »