Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование лекции.doc
Скачиваний:
49
Добавлен:
12.11.2019
Размер:
5.53 Mб
Скачать

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

В законе Мэрфи сказано: никогда не отлавливайте ошибки в программах, если не знаете, что с ними потом делать. Тема ошибок в программном обеспечении, к большому сожалению, остается актуальной по сей день. Корень проблемы лежит не столько в разгильдяйстве программистов, сколько в сложности разрабатываемых ими программ. Не существует способа автоматизированно проверить корректность той или иной программы за приемлемое время. В каждой мало-мальски сложной программе есть большое количество команд ветвления (операторов IF). Каждая команда ветвления дает два варианта дальнейших действий программы. Еще один IF добавляет следующую пару вариантов и т.д., причем варианты не суммируются, а перемножаются. Общее число способов выполнения программы оказывается равным 2n, где n – число операторов IF в программе. Для больших и сложных программ n составляет несколько десятков тысяч. Очевидно, проверить все возможные способы выполнения программы становится совершенно невозможным. Увы, надежность программного обеспечения на сегодняшний день заметно отстает от надежности "материальной" техники. Поэтому для проверки больших и сложных программ чаще всего применяют так называемое бета-тестирование. Бета-версией называется готовая программа, которую создатели передают в опытную эксплуатацию некоторой группе пользователей. За время опытной эксплуатации (от трех месяцев до года) обычно обнаруживается большинство ошибок, правда, за счет пользователей-экспериментаторов. Придумать другого пути тестирования пока не удается.

В принципе все ошибки в программировании делятся на несколько видов (Рис. 19 .69). При возникновении любой ошибки в программе происходит так называемое прерывание.

Прерывание (interrupt) – событие, при наступлении которого процессор прекращает текущую деятельность и начинает выполнять программу – обработчик прерывания (Рис. 19 .70).

Рис. 19.69. Классификация ошибок.

Рис. 19.70. Прерывание в программе.

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

Предположим, что неопытный программист написал следующую вредительскую программу:

VAR x,y:REAL;

BEGIN x:=10.0; y:=0.0; x:=x/y

Разумеется, при ее выполнении должна возникнуть ошибка. Вот как это произойдет (Рис. 19 .71): сначала возникнет прерывание, соответствующе ошибке "деление на ноль", затем обработчик прерывания примет решение о прекращении работы программы (ошибка фатальная) и выведет на экран сообщение типа "Runtime error 200 at 020D:0901", будет вызвана процедура выхода из программы и, наконец, работа программы позорно завершится.

Рис. 19.71. Обработка ошибки времени выполнения.

А откуда взялись шестнадцатеричные числа 020D:0901 в сообщении об ошибке? Эти числа представляют собой адрес команды, вызвавшей ошибку, внутри exe-файла. Поскольку exe-файл никаким образом невозможно перевести обратно в программу на Паскале, информация об адресе возникновения ошибки достаточно бесполезна – она никаким образом не связана с операторами исходной программы. Именно поэтому отлаживать программу надо в среде Паскаля/Delphi, обеспечивающей поиск ошибочного места в исходном тексте программы.