Основы объектно-ориентированного программирования


Запросы при работе с классом EXCEPTIONS - часть 2


Приведу несколько других запросов, обеспечивающих при необходимости дополнительной информацией. Смысл запросов понятен из их описания:

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 пишется специально для того, чтобы обработать определенный вид возможных исключений. Этот стиль позволяет избежать анализа других неожиданных видов исключений.




- Начало -  - Назад -  - Вперед -



Книжный магазин