Имея эти свойства, предложение
rescue
if is_assertion_violation then
"Случай, обрабатывающий нарушение утверждений"
else if is_signal then
"Случай, обрабатывающий сигналы операционной системы"
else
...
end
Используя класс
if exception = Numerical_error then
division_tried := True; retry
end
Так как здесь нет else ветви, то исключения, отличные от
Какой должна быть степень контроля?
Могут возникнуть замечания по поводу уровня обработки специфических исключений, иллюстрируемых двумя последними примерами. В этой лекции проводилась та точка зрения, что исключение - нежелательное событие; когда оно возникает, то естественная реакция ПО и его разработчика - "я не хочу быть здесь! Выпустите меня отсюда, как можно скорее!". Это, кажется, несовместимым с проведением в предложении rescue глубокого анализа источника исключений.
По этой причине я пытался в моей собственной работе избегать детального разбора случаев причины исключений, стараясь показать, что обработка исключений лишь фиксирует ситуацию, если может, а затем либо fail, либо retry.
Этот стиль, вероятно, слишком строг, и некоторые разработчики предпочитают менее ограниченную схему, используя в полной мере механизм запросов класса
Принцип Простоты Исключения
Вся обработка, выполняемая в предложении rescue, должна оставаться простой и фокусироваться на единственной цели - возвратить объект получателя в стабильное состояние, допуская повторение, если это возможно.
Исключения разработчика
Все исключения, изучаемые до сих пор, были результатом событий внешних по отношению к ПО (сигналы операционной системы) или принудительных следствий его работы (нарушение утверждений). В некоторых приложениях полезно, чтобы исключения возникали по воле разработчика в определенных ситуациях.
Такие исключения называются исключениями разработчика. Они характеризуются как целочисленным кодом, отличающимся от системных кодов, так и именем (строкой), которые могут быть использованы, например, в сообщениях об ошибке. Можно использовать следующие свойства для возбуждения исключения разработчика и для анализа его свойств в предложении rescue.
trigger (code: INTEGER; message: STRING)
-- Прерывает выполнение текущей программы, выбрасывая исключение с кодом
-- code и связанным текстовым сообщением.
developer_exception_code: INTEGER
-- Код последнего исключения разработчика
developer_exception_name: STRING
-- Имя, ассоциированное с последним исключением разработчика
is_developer_exception: BOOLEAN
-- Было ли последнее исключение исключением разработчика?
is_developer_exception_of_name (name: STRING): BOOLEAN
-- Имеет ли последнее исключение разработчика имя name?
ensure
Result := is_developer_exception and then
equal (name, developer_exception_name)
Иногда полезно связать с исключением разработчика контекст - произвольный объект, структура которого может быть полезной при обработке исключения разработчика:
set_developer_exception_context (c: ANY)
-- Определить c как контекст, связанный с последовательностью