Запросы при работе с классом EXCEPTIONS
Запросы при работе с классом EXCEPTIONS
Класс EXCEPTIONS обеспечивает несколько запросов для получения требуемой информации о последнем исключении. Прежде всего, можно получить целочисленный код этого исключения:
exception: INTEGER
-- Код последнего встретившегося исключения
original_exception: INTEGER
-- Код последнего исключения - первопричины текущего исключения
Разница между exception и original_exception важна в случае "организованной паники". Если программа получила исключение с кодом oc, указывающим на арифметическое переполнение, но не имеет предложения rescue, то вызывающая программа получит исключение, код которого, заданный значением exception, будет указывать на "отказ в вызванной программе". Но на этом этапе или выше по цепи вызовов может понадобиться выяснить оригинальное исключение - первопричину появления исключений - код oc, который и будет значением original_exception.
Коды исключений являются целыми. Значения для предопределенных исключений задаются целочисленными константами, обеспечиваемыми классом EXCEPTIONS (который наследует их от класса EXCEPTIONS_CONSTANTS). Вот несколько примеров:
Check_instruction: INTEGER is 7
-- Код исключения при нарушении утверждения check
Class_invariant: INTEGER is ...
-- Код исключения при нарушении инварианта класса
Incorrect_inspect_value: INTEGER is ...
-- Код исключения, когда проверяемое значение не является ни одной
-- ожидаемых констант, если отсутствует часть Else
Loop_invariant: INTEGER is ...
-- Код исключения при нарушении инварианта цикла
Loop_variant: INTEGER is ...
-- Код исключения при нарушении убывания варианта цикла
No_more_memory: INTEGER is ...
-- Код исключения при отказе в распределении памяти
Postcondition: INTEGER is ...
-- Код исключения при нарушении постусловия
Precondition: INTEGER is ...
-- Код исключения при нарушении предусловия
Routine_failure: INTEGER is ...
-- Код исключения при отказе вызванной программы
Void_assigned_to_expanded: INTEGER is ...
Так как значения констант не играют здесь роли, то показано только первое из них.
Приведу несколько других запросов, обеспечивающих при необходимости дополнительной информацией. Смысл запросов понятен из их описания:
meaning (except: INTEGER)
-- Сообщение, описывающее природу исключения с кодом except
is_assertion_violation: BOOLEAN
-- Является ли последнее исключение нарушением утверждения
-- или нарушением убывания варианта цикла
ensure
Result = (exception = Precondition) or (exception = Postcondition) or
(exception = Class_invariant) or
(exception = Loop_invariant) or (exception = Loop_variant)
is_system_exception: BOOLEAN
-- Является ли последнее исключение внешним событием
-- (ошибкой операционной системы)?
is_signal: BOOLEAN
-- Является ли последнее исключение сигналом операционной системы?
tag_name: STRING
-- Метка утверждения, нарушение которого привело к исключению
original_tag_name: STRING
-- Метка последнего нарушенного утверждения оригинальным исключением.
recipient_name: STRING
-- Имя программы, чье выполнение было прервано последним исключением
class_name: STRING
-- Имя класса, включающего получателя последнего исключения
original_recipient_name: STRING
-- Имя программы, чье выполнение было прервано
-- последним оригинальным исключением
original_class_name: STRING
-- Имя класса, включающего получателя последнего оригинального исключения
Имея эти свойства, предложение rescue может управлять каждым исключением особым способом. Например, в классе, наследуемом от EXCEPTIONS, предложение rescue можно написать так:
rescue
if is_assertion_violation then
"Случай, обрабатывающий нарушение утверждений"
else if is_signal then
"Случай, обрабатывающий сигналы операционной системы"
else
...
end
Используя класс EXCEPTIONS, можно модифицировать пример quasi_inverse, чтобы он выполнял retry только при переполнении. Другие исключения, например, нажатие пользователем клавиши "break" не должны приводить к retry. Инструкция в предложении rescue теперь может иметь вид:
if exception = Numerical_error then
division_tried := True; retry
end
Так как здесь нет else ветви, то исключения, отличные от Numerical_error, будут причиной отказа - корректное следствие, поскольку программа не имеет рецепта восстановления в подобных случаях. Иногда предложение rescue пишется специально для того, чтобы обработать определенный вид возможных исключений. Этот стиль позволяет избежать анализа других неожиданных видов исключений.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Запросы
Запросы Отдельные запросы представляются с помощью структуры struct request, которая тоже определена в файле <linux/blkdev.h>. Каждый запрос может состоять из более чем одной структуры bio, потому что один запрос может содержать обращение к нескольким смежным дисковым блокам.
Запросы по запросу
Запросы по запросу Метки: мониторингВозможно, вам неудобно заходить на сайты мониторинговых сервисов. Тогда можете воспользоваться подпиской: как только интересующие вас ключевые слова появятся в блогах или на форумах, система отправит вам уведомление.Представьте,
5.24.3 Обратные запросы ARP
5.24.3 Обратные запросы ARP Один из вариантов ARP называется обратным запросом (reverse ARP — RARP) и служит для определения узлом собственного IP-адреса. Такие запросы предназначены для бездисковых рабочих станций и других устройств, которые получают конфигурационную информацию от
7.6.1 Эхо-запросы и эхо-ответы
7.6.1 Эхо-запросы и эхо-ответы Эхо-запросы (Echo Request) и эхо-ответы (Echo Reply) применяются для проверки активности системы. Код типа 8 применяется в запросах, а код 0 — в ответах. Количество октетов в поле данных переменно и может выбираться отправителем.Отвечающая сторона должна
21.5.4 Другие запросы
21.5.4 Другие запросы Оставшиеся запросы используются клиентом и сервером аналогичным способом. Данные могут быть переданы и получены через обычные запросы записи и чтения. Соединение может быть закрыто по запросу close. Существуют также специальные запросы send и recv,
Сложные запросы
Сложные запросы С помощью сложных запросов можно выполнить следующее.• Представить данные из нескольких связанных таблиц в виде одной.• Выбрать данные по заданному пользователем условию.• Создать пользовательские поля запроса, значения которых будут основываться на
Запросы на изменение
Запросы на изменение Запросы на изменение дают возможность корректировать данные, содержащиеся в таблицах.Существует четыре вида запросов на изменение:• запрос на создание таблицы – создает новую таблицу на основе данных, которые уже размещены в одной или нескольких
14. Объявление переменной на внутреннем уровне с классом памяти static
14. Объявление переменной на внутреннем уровне с классом памяти static В качестве примера рассмотрим объявление переменной i на внутреннем уровне с классом памяти static.исходный файл filel.сmain(){}fun1(){static int i = 0; исходный файл file2.c fun2(){static int i = 0; }fun3(){static int i = 0; }В этом примере
Запросы на объединение
Запросы на объединение Запрос на объединение (union query) выполняет объединение содержимого двух таблиц, имеющих одинаковые структуры полей. Это оказывается полезным, когда нужно отобразить в одном результирующем наборе потенциально не связанные записи из нескольких
Запросы на обновление
Запросы на обновление Запрос на обновление может изменить сразу целую группу записей. Этот запрос состоит из трех частей:• предложение UPDATE, которое указывает на обновляемую таблицу;• предложение SET, задающее данные для обновления;• необязательный критерий WHERE,
Запросы
Запросы Аналогично сценариям создания и изменения, с помощью Visual Studio .NET можно генерировать запросы. За исключением тривиальных запросов, конструктор запросов с графическим пользовательским интерфейсом позволяет более эффективно и безошибочно создавать самые сложные
Стандартные модули и модули с классом
Стандартные модули и модули с классом Большинство создаваемых VBA-модулей - это стандартные модули. В предыдущих версиях VBA и в Visual Basic стандартные модули назывались модулями программного кода.Такие модули содержат объявления переменных и констант, определения
Работа с классом FileInfo
Работа с классом FileInfo Как показывает пример MyDirectoryApp, класс FileInfo позволяет получить подробные сведения о файлах, имеющихся на вашем жестком диске (время создания, размер, атрибуты и т.д.), а также помогает создавать, копировать, перемещать и уничтожать файлы. Вдобавок к
ГЛАВА 20. Запросы DML.
ГЛАВА 20. Запросы DML. Приложения пользователя могут получить доступ к таблицам Firebird только одним путем - выполняя к ним запрос. По своей сущности запрос является оператором SQL, который передается на сервер. Оператор SQL является выражением, состоящим из ключевых слов, фраз и