Составители:
Рубрика:
Основная трудность для понимания деталей реализации обработки
исключений в CLI заключается в том, что обработка исключений частично
закодирована в телах методов (в виде специальных инструкций), а частич-
но – в заголовках методов. Скорее всего, такая смешанная схема была вы-
брана разработчиками CLI для обеспечения компактности сборок. Поэто-
му мы в данном разделе сначала рассмотрим ту часть информации об обра-
ботке исключений, которая расположена в заголовках методов, затем пе-
рейдем к инструкциям CIL и, в конце концов, свяжем все воедино, приве-
дя семантику обработки исключений виртуальной системой выполнения.
3.4.1. Предложения обработки исключений в заголовках методов
Для дальнейшего изложения нам понадобится ввести понятия обла-
сти в коде метода и координат области.
Будем называть областью непрерывную последовательность инструк-
ций в коде метода. При этом область будет определяться своими координа-
тами, а именно парой чисел (offset, length), где offset – это смещение
первой инструкции области относительно начала тела метода, а length –
длина области. Как смещение, так и длину будем измерять в байтах.
Заголовок каждого метода содержит специальный массив, элементы
которого называются предложениями обработки исключений (exception
handling clause).
Каждое предложение обработки исключений представляет собой
структуру, состоящую из нескольких полей. В этих полях записаны коор-
динаты двух или трех областей, а именно: в любом предложении присут-
ствуют координаты защищенной области (protected block) и области обра-
ботчика (exception handler), а в некоторых предложениях дополнительно
описана область фильтра (filter block).
Если говорить в терминах языка C#, то защищенная область – это
try-блок, а область обработчика – это либо catch-блок, либо finally-блок.
Аналог для области фильтра в языке C# отсутствует, но зато он есть в Visual
Basic .NET и в Visual C++ with Managed Extensions. Область фильтра со-
держит код, принимающий решение о том, может ли данное исключение
быть обработано обработчиком. Естественно, такое представление о на-
значении областей в предложении обработки исключений несколько при-
митивно и понадобится нам лишь на начальном этапе.
Давайте рассмотрим два возможных формата, в которых кодируется
массив предложений обработки исключений. В каждом из двух форматов
содержатся одни и те же поля, и различаются они только размерами полей.
Первый формат называется коротким форматом (см. таблицу 3.43) и ис-
пользуется тогда, когда смещения областей не превышают 65535 байт, а
длины областей не превышают 255 байт. Во втором, длинном формате
(см. таблицу 3.44) допускаются любые смещения и длины. Строго говоря,
Common Intermediate Language
117
Диаграмма стека для инструкций refanytype:
... , typedRef -> ... , type
3.3.4.3. Загрузка значения типизированной ссылки
Инструкция refanyval (см. таблицу 3.42) загружает управляемый ука-
затель, хранящийся в типизированной ссылке, на вершину стека вычисле-
ний.
Таблица 3.42. Инструкция refanyval
Диаграмма стека для инструкций refanyval:
... , typedRef -> ... , ptr
3.4. Язык CIL: обработка исключений
Существует два основных способа перехвата ошибок, возникающих в
процессе работы программы:
• Обработка кодов возврата.
Функция, выполнение которой может привести к ошибочной
ситуации, возвращает некоторое значение, сообщающее, ус-
пешно или неуспешно функция выполнила свою задачу. Перех-
ват ошибок заключается в том, что в коде, вызывающем такую
функцию, стоят проверки ее возвращаемого значения.
Этот способ хорошо работает, если глубина стека вызовов функ-
ций в программе относительно невелика. В противном случае
код программы из-за постоянных проверок становится громозд-
ким и трудночитаемым.
• Обработка исключений.
Этот способ заключается в том, что в случае возникновения
ошибки генерируется так называемая исключительная ситуация
(исключение), которая описывается некоторым объектом. Гене-
рация исключения приводит к передаче управления на фраг-
мент кода программы, называемый обработчиком исключения.
Преимуществом такого подхода является то, что перехват оши-
бок локализован в отдельной части программы, а не распреде-
лен по всему коду, как в случае с обработкой кодов возврата.
116
CIL и системное программирование в Microsoft .NET
Код Инструкция Встроенный Описание
операнд
0xC2 refanyval token Загружает адрес, хранящийся в
типизированной ссылке
116 CIL и системное программирование в Microsoft .NET Common Intermediate Language 117
Диаграмма стека для инструкций refanytype: Основная трудность для понимания деталей реализации обработки
... , typedRef -> ... , type исключений в CLI заключается в том, что обработка исключений частично
закодирована в телах методов (в виде специальных инструкций), а частич-
3.3.4.3. Загрузка значения типизированной ссылки но – в заголовках методов. Скорее всего, такая смешанная схема была вы-
Инструкция refanyval (см. таблицу 3.42) загружает управляемый ука- брана разработчиками CLI для обеспечения компактности сборок. Поэто-
затель, хранящийся в типизированной ссылке, на вершину стека вычисле- му мы в данном разделе сначала рассмотрим ту часть информации об обра-
ний. ботке исключений, которая расположена в заголовках методов, затем пе-
рейдем к инструкциям CIL и, в конце концов, свяжем все воедино, приве-
Таблица 3.42. Инструкция refanyval дя семантику обработки исключений виртуальной системой выполнения.
Код Инструкция Встроенный Описание 3.4.1. Предложения обработки исключений в заголовках методов
операнд Для дальнейшего изложения нам понадобится ввести понятия обла-
0xC2 refanyval token Загружает адрес, хранящийся в сти в коде метода и координат области.
типизированной ссылке Будем называть областью непрерывную последовательность инструк-
ций в коде метода. При этом область будет определяться своими координа-
Диаграмма стека для инструкций refanyval: тами, а именно парой чисел (offset, length), где offset – это смещение
... , typedRef -> ... , ptr первой инструкции области относительно начала тела метода, а length –
длина области. Как смещение, так и длину будем измерять в байтах.
Заголовок каждого метода содержит специальный массив, элементы
3.4. Язык CIL: обработка исключений которого называются предложениями обработки исключений (exception
handling clause).
Существует два основных способа перехвата ошибок, возникающих в Каждое предложение обработки исключений представляет собой
процессе работы программы: структуру, состоящую из нескольких полей. В этих полях записаны коор-
• Обработка кодов возврата. динаты двух или трех областей, а именно: в любом предложении присут-
Функция, выполнение которой может привести к ошибочной ствуют координаты защищенной области (protected block) и области обра-
ситуации, возвращает некоторое значение, сообщающее, ус- ботчика (exception handler), а в некоторых предложениях дополнительно
пешно или неуспешно функция выполнила свою задачу. Перех- описана область фильтра (filter block).
ват ошибок заключается в том, что в коде, вызывающем такую Если говорить в терминах языка C#, то защищенная область – это
функцию, стоят проверки ее возвращаемого значения. try-блок, а область обработчика – это либо catch-блок, либо finally-блок.
Этот способ хорошо работает, если глубина стека вызовов функ- Аналог для области фильтра в языке C# отсутствует, но зато он есть в Visual
ций в программе относительно невелика. В противном случае Basic .NET и в Visual C++ with Managed Extensions. Область фильтра со-
код программы из-за постоянных проверок становится громозд- держит код, принимающий решение о том, может ли данное исключение
ким и трудночитаемым. быть обработано обработчиком. Естественно, такое представление о на-
• Обработка исключений. значении областей в предложении обработки исключений несколько при-
Этот способ заключается в том, что в случае возникновения митивно и понадобится нам лишь на начальном этапе.
ошибки генерируется так называемая исключительная ситуация Давайте рассмотрим два возможных формата, в которых кодируется
(исключение), которая описывается некоторым объектом. Гене- массив предложений обработки исключений. В каждом из двух форматов
рация исключения приводит к передаче управления на фраг- содержатся одни и те же поля, и различаются они только размерами полей.
мент кода программы, называемый обработчиком исключения. Первый формат называется коротким форматом (см. таблицу 3.43) и ис-
Преимуществом такого подхода является то, что перехват оши- пользуется тогда, когда смещения областей не превышают 65535 байт, а
бок локализован в отдельной части программы, а не распреде- длины областей не превышают 255 байт. Во втором, длинном формате
лен по всему коду, как в случае с обработкой кодов возврата. (см. таблицу 3.44) допускаются любые смещения и длины. Строго говоря,
Страницы
- « первая
- ‹ предыдущая
- …
- 63
- 64
- 65
- 66
- 67
- …
- следующая ›
- последняя »
