Генерирование и обработка нескольких типов собственных исключений

Есть такой код. Считываем строку с клавиатуры и генерируем разные исключения: если строка не из 3-х символов - одно, если из 3-х но первая буква ‘а’ - второе, и в других случаях третье.

В данной ситуации я могу обработать только то исключение, которое указано первым в блоке except. В других ветках невозможно получить доступ к e.Message, т.к. e = nil и соответственно возникает ошибка “Ссылка на объект не указывает на экземпляр”.

Если ввести строку не из 3 символов, все будет в порядке. Введем “abc” - вышеуказанная ошибка. Поменяем местами обработку IncorrectInputException и e:MyException1. “abc” - обработается, “ab” - вылет. Как их расположить, чтобы программа могла обработать все ситуации?

[code]type MyException1 = class(Exception); MyException2 = class(Exception); IncorrectInputException = class(Exception);

procedure GenException(s:string); begin if s.Length <> 3 then raise new IncorrectInputException(‘wrong format!’) else if s[1] = ‘a’ then raise new MyException1(‘EXCEPTION1!!’) else raise new MyException2(‘EXCEPTION2!!’); end;

begin try var str := readString(‘Enter the string with length 3:’); GenException(str); except on e:IncorrectInputException do println(e.Message); on e:MyException1 do println(e.Message); on e:MyException2 do println(e.Message); end; end.[/code]

Проблема решилась так

on e:IncorrectInputException do println(e.Message); on e2:MyException1 do println(e2.Message); on e3:MyException2 do println(e3.Message);

Да, понятно. Пока используйте в разных ветках разные имена переменных исключений

возможно это рукожопно но есть ещё такой вариант…

except
on e:System.Exception do begin
if e is IncorrectInputException then println(e.Message) else
if e is MyException1 then println(e.Message) else
if e is MyException2 then println(e.Message);
end; end;

на практике не тестил но в теории - должно пахать…

Нет, это неправильно

Исправим компилятор - тогда будет работать исходный вариант

Ошибка исправлена. Версия - на сайте

1 лайк