Есть такой код. Считываем строку с клавиатуры и генерируем разные исключения: если строка не из 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]