Обработка исключительных ситуаций

Чтобы сделать свое приложение устойчивым к ошибкам, вам необходимо распознать исключение и обработать его. Если вы не напишете обработчик исключения, приложение отобразит окно сообщения об ошибке.

Обработчик исключения — это программа, которая начинает свое выполнение в случае возникновения определенной исключительной ситуации. Обработник исключения выполняется вместо стандартной реакции приложения на ошибку.

При обработке исключительных ситуаций Kylix работает с так называемыми объектами исключений. Так как Kylix — объектно-ориентированная среда программирования, то логично, что и исключительная ситуация — тоже объект. Для работы с этим объектом в Kylix присутствуют специальные языковые конструкции, которые мы и рассмотрим далее.

Программисту чаще всего известно, в каком именно месте программы может возникнуть исключительная ситуация (например, место, где происходит открытие файла, расположенного на диске). Для того чтобы обработать ее, нужно этот кусок кода защитить. Таким образом, данный блок кода будет называться защищенным.

Рассмотрим языковые конструкции, предоставляемые средой Kylix, которые обеспечивают защищенный код.

Первая конструкция имеет вид, представленный в листинге 9.1.

Листинг 9.1. Синтаксис конструкции try...except

 try
// здесь находятся операторы защищенного кода
except
on Exception1 do // операторы, выполняемые в случае
// возникновения ошибки 1
on Exception2 do // операторы, выполняемые в случае // возникновения ошибки 2
. . .
else
// операторы, выполняемые в случае возникновения ошибки, не являющейся ни ошибкой 1
//ни ошибкой 2 end;

Таким образом, вы размещаете "опасный" участок кода после слова try, и если при выполнении этого кода произойдет исключительная ситуация, оно прекратится и начнут выполняться команды, расположенные после слова except.

В разделе except могут находиться или только операторы обработки исключений, которые начинаются со слова-приставки on, или только произвольные операторы, не являющиеся операторами обработки исключений. В вышеприведенном листинге представлена ситуация, когда в разделе except находятся только операторы обработки исключений. Если в блоке операторов, расположенных после слова try, произошла ошибка Exception1, то будут выполнены только те команды, которые расположены после слов on Exception1 do. Далее объект исключения уничтожается и программа продолжает выполнять операторы, расположенные после слова end; рассматриваемой конструкции.

Раздел после слова else является необязательным и может отсутствовать. Он предназначен для обработки любых других исключений, не предусмотренных в разделе except. Если же раздел else отсутствует, но в защищенном коде произошла исключительная ситуация, не предусмотренная ни одним обработчиком исключений on Exception do, то произойдет стандартная (определенная операционной системой) обработка данной исключительной ситуации с появлением соответствующего информационного окна с сообщением об ошибке.

Рассмотрим оператор обработки исключений более подробно. Как видно из листинга 9.1, данный оператор может присутствовать внутри раздела except или принимать одну из двух форм:

on <класс исключения> do <оператор>;

или

on <имя>: <класс исключения>

do // операторы, в которых можно использовать свойства исключения

В листинге 9.1 мы привели только первую форму представления оператора. Но, так как исключение является объектом, то было бы иногда очень удобно обратиться к его свойствам. Однако для того, чтобы обращаться к свойствам какого-либо объекта, необходимо знать его имя. Вторая форма оператора обработки исключений применяется именно тогда, когда нам нужно обратиться к свойствам возникшего исключения. Для этого исключению присваивается временное имя <имя> и к его свойствам можно обращаться через точку:

<имя>.<свойство>

В листинге 9.2 приведена та же конструкция, что и в листинге 9.1, только в блоке except нет операторов обработки исключений. Таким образом, при возникновении любой исключительной ситуации в защищенном блоке будут выполняться операторы, расположенные после слова except.

Листинг 9.2. Конструкция try...except без операторов обработки исключений

try
// здесь находятся операторы защищенного кода
except
Operator1; // операторы, выполняемые в случае
Operator2; // возникновения любой исключительной ситуации, Operator3; // возникшей в защищенной области
...
end;

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

Листинг 9.3.Обработка деления на ноль

try
а:=8;
b:=0;
с:=а/b; except
on EZeroDivide do MessageBox{'Внимание! Деление на ноль!') end;

При выполнении данного кода будет сгенерирована исключительная ситуация, принадлежащая к классу EZeroDivide (деление целых чисел на ноль). Данная исключительная ситуация обработается в секции except и приложение выдаст на экран окно с сообщением Внимание! Деление на ноль! (рис. 9.1).

9-03-1.jpg

Рис. 9.1. Окно сообщения

Примечание
Знание имен классов исключений необходимо при обработке исключительных ситуаций. Мы рассмотрим их далее в этой главе.

В листинге 9.4 приведен пример использования временного имени объекта исключения в своих целях.

Листинг 9.4. Использование временного имени объекта ислючения

try
ScrollBar1.Max:=ScrollBar.Min-1; except
on E: EInvalidOperation do
MessageDlg('Произошло исключение: '+Е.Message, mtlnformation, [mbOK],0)
end;

В защищенном блоке кода программы будет осуществлена недопустимая для объекта ScrollBox1 операция присвоения максимального значения списка меньшего, чем минимальное значение. Возникнет исключение класса EInvalidOperation. Таким образом, мы присваиваем объекту исключения, принадлежащего к классу EinvalidOperation, временное имя Е, после чего можем обращаться к свойствам объекта исключения Е. Мы самостоятельно выводим в окне сообщения текст ошибки Е.Message, который выдается по умолчанию (в том случае, если бы нашего обработчика исключения не было). Результат работы кода листинга 9.4. представлен на рис. 9.2.

9-03-2.jpg

Рис. 9.2. Окно сообщения об исключении

Примечание
С объектами исключений нужно работать очень осторожно. Ни в коем случае самостоятельно не уничтожайте объекты исключения — это может привести к ошибке работы программы. После завершения обработки исключения Kylix самостоятельно позаботится об его уничтожении.

Рассмотрим теперь классы исключений. Они необходимы для обработки конкретных исключительных ситуаций. Мы представляем классы исключений не в иерархии, а в алфавитном порядке.

Таблица 9.1. Коды ошибок ввода/вывода

Linux

Windows

Код ошибки

Описание

Код ошибки

Описание

2

 

Нет файла или каталога

 

2

Файл не найден

3

Путь к файлу не найден

5

Ошибка ввода/вывода

5

Доступ запрещен

13

Доступ запрещен




20

Не является каталогом

21


Является каталогом


32

Ошибка совместного использования файла

Ошибки, не зависящие от операционной системы

Код ошибки

Описание


100

Достигнут конец файла


101

Диск полон


102

Файловая переменная не назначена


103

Файл не открыт


104

Файл не открыт для ввода


105

Файл не открыт для вывода


106

Ошибка ввода по формату


107

Файл уже открыт


Hosted by uCoz