Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 66 стр.

UptoLike

щихся друг от друга тем, по каким критериям принимается решение о пе-
редаче на них управления:
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      –          Генерирует исключение