Урок Delphi 10

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




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



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

   Как в такой ситуации действует человек? Если он пытается что-то сделать, и это не получается - он идёт другим путём. Так же и компьютер, следующий программе, умеющей обрабатывать исключительные ситуации. Он не бросает выполнение программы, не виснет, а обходит исключительную ситуацию, выполняя альтернативный вариант фрагмента, в которой исключительная ситуация возникла.

   Возникает вопрос, почему бы не поставить проверку, например, на равенство нулю знаменателя при делении? Можно и поставить. Но во многих случаях источник исключительной ситуации далеко не так очевиден, а на все случаи жизни проверки не введёшь.

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

   Вот как выглядит оператор контроля исключительных ситуаций:

try
   основные операторы фрагмента;
except
   альтернативный вариант фрагмента;
end;

   Вначале производится попытка выполнить операторы секции try/except, содержащие основной вариант программы. При возникновении в каком-либо операторе этой секции исключительной ситуации остальные операторы секции пропускаются, и выполняется секция except/end. Если всё "проходит штатно", то секция except/end пропускается.

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

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

   Есть ещё один способ контроля исключительных ситуаций, касающийся ошибок операций ввода-вывода.
Перед участком программы, где возможны ошибки ввода-вывода (а это, по сути, все операторы ввода-вывода), ставится директива {$I-}, заставляющая компилятор не включать в код автоконтроль ошибок ввода-вывода. Таким образом, в случае ошибки ввода или вывода программа не прерывается. В конце участка с операторами ввода-вывода ставится директива, включающая автоконтроль: {$I+}. Затем анализируется результат вызова функции IOResult. Если функция IOResult (вызывается без параметров) возвращает 0, значит ошибок ввода-вывода на данном участке не было.

Вот какой пример использования директив {$I} и функции IOResult содержит справка системы Delphi:

var
  F: file of Byte;
begin
  if OpenDialog1.Execute then
  begin
    AssignFile(F, OpenDialog1.FileName);
    {$I-}
    Reset(F);
    {$I+}
    if IOResult = 0 then
    begin
      MessageDlg('File size in bytes: ' + IntToStr(FileSize(F)), mtInformation, [mbOk], 0);
      CloseFile(F);
    end
    else
      MessageDlg('File access error', mtWarning, [mbOk], 0);
  end;
end;


   Функция IOResult досталась Delphi в наследство от Turbo Pascal. Тот же самый фрагмент можно составить и с использованием оператора try. На мой взгляд, это удобнее и проще.

   При работе программы под управлением Delphi, система будет сама реагировать на исключительные ситуации, мешая работе операторов обработки исключений. Чтобы проверить их действие, можно запускать программу непосредственно, сворачивая Delphi и пользуясь ярлыком, установленном на Рабочем столе. Или можно отключить реакцию системы на исключительные ситуации, тем самым давая возможность отработать специально для этого написанным фрагментам программы - нашим операторам try/except/end. Для этого откроем пункт системного меню Delphi Tools -> Debugger Options.... В появившемся окошке нужно снять галку в чекбоксе Stop on Delphi Exceptions, расположенном на вкладке Language Exceptions. Теперь система Delphi будет предоставлять вашей программе возможность самостоятельно обрабатывать исключительные ситуации, среди которых могут быть и ситуации, возникновение которых прописано специально как удобный инструмент достижения необходимых результатов.


Создание подпрограмм в Delphi           В начало урока          Взаимодействие приложения с пользователем 

Уроки Delphi начинающим



Вопросы и комментарии (15)      Решение задач в Delphi

василий , добавлено 25.09.09, 01:45:18 
Пасибо !!! хорощё что я вас нашел...=)не знаю как остальным но мне стало понятно и помогло!
Владимир, добавлено 22.11.09, 10:13:54 
Очень доступно и хорошо описано введение в программирование. Я за вечер во всем разобрался.
И уже пару программок своих написал. Большое спасибо Вам.
Елена, добавлено 1.12.09, 08:52:26 
Спасибо за хорошие уроки. Есть вопрос про директивы, которые пишутся примерно так {$I-} помогите, пожалуйста, с ними разобраться
Автор, добавлено 1.12.09, 11:42:51 
Директивы {$I} используются для контроля за операциями ввода-вывода.
Перед участком, где возможны ошибки ввода-вывода, ставится директива {$I-}.
Она отключает автоконтроль этих ошибок, и программа не прерывается.
После этого участка ставится директива {$I+}, возобновляющая автоконтроль.
Далее необходимо вызвать функцию IOResult и проанализировать возвращаемый ею результат.
Если функция возвратит 0, то ошибок не было.
Функция IOResult досталась Delphi в наследство от Turbo Pascal. Я думаю, что в Delphi более удобной альтернативой является использование операторов try.
Кстати, спасибо за вопрос, введу материал в основную часть урока.
Иван, добавлено 19.10.10, 22:16:44 
У меня вопрос к фразе \\\"На мой взгляд, это удобнее и проще\\\". Какой именно? Тот что через try или же через {$I-}.
Автор, добавлено 19.10.10, 22:57:58 
На мой взгляд, проще или скорее привычнее, через try.
Иван, добавлено 20.10.10, 11:37:14 
Ясно. А кстати хотел все спросить, почему тебя нет в icq? А то так хотел написать, не получается.
И еще. Вот я попробовал исключительную ситуацию. Конкретный пример:
try
one:=strtofloat(edit1.Text);
two:=strtofloat(edit2.Text);
except
messagebox(handle, \\\'Заполните все поля!\\\', \\\'Пустые(ая) строка(и)\\\',
mb_ok or mb_iconwarning);
end;
try
otv:=one/two;
messagebox(handle, \\\'otv\\\', \\\'Ответ\\\',
mb_ok or mb_iconinformation);
except
messagebox(handle, \\\'Деление на ноль!\\\', \\\'Не верные действия\\\', mb_ok or
mb_iconstop);
end;
Почему-то если он встречает первый альтернативный вариант, когда окно(а) ввода пуст(ы), то он идет и ко второму альтернативному варианту. Почему? Например в моей ситуации когда какая-то строка ввода пуста он пишет Заполните все поля, после нажатия на Ок, сразу выдает что будто я делю на ноль, сразу же после нажатия на кнопку Ок.
Автор, добавлено 20.10.10, 16:54:17 
Я не с компа, но. Если поля едитов пусты, функция StrToFloat не сработает и будет И.С. но в переменных будет какое-то значение, может и ноль скорее всего, вот ты на него и делишь. Проверь это оператором if или точку останова поставь и посмотри.
Алексей, добавлено 19.12.10, 11:05:29 
а я все равно не понимаю, TRY - это пробовать, EXCEPT - если try не сработал. тогда почему эти строки вызывают ошибку
  try
  Memo1.Lines.LoadFromFile('c:\1.bat')
  except
  showmessage('файла не существует')
  end;

т.е. "попробуй открыть файл, если не сможешь, то сообщи". вместо этого программа критично завершается. (файла естественно нет). в чем ошибка ?
Автор, добавлено 19.12.10, 11:45:41 
Если вы выполняете программу в среде Delphi, то сама Delphi реагирует по-любому на ошибку, если эту реакцию не отключить, как написано в окончании урока.
Гость_, добавлено 5.06.11, 12:01:04 
Спасибо автору за урок! Сегодня практиковался с оператором try и возник небольшой вопрос:
в такой программе
<...>
a:=3;
b:=0;
try
c:=a/b;
showmessage('All right! C='+floattostr(c));
finally showmessage('Обязательный вариант');
end;
<...>
при срабатывании процедуры, в которой находится try выдаётся ошибка о том что есть деление на ноль, секция finally срабатывает как положено, реакция среды была отключена, и даже при запуске вне среды разработки появляется сообщение об ошибке что есть деление на ноль.
При выполнении такой программы:
<...>
a:=3;
b:=0;
try
c:=a/b;
showmessage('All right! C='+floattostr(c));
except showmessage('деление на ноль');
end;
<...>
всё срабатывает отлично, без всяких сообщений-ошибок по поводу делениия на ноль.
Подскажите пожалуйста, это так и должно быть при использовании try/finally, или это у меня что-то не так?
Гость_, добавлено 5.06.11, 12:09:48 
И почему нету такого сообщения-ошибки при выполнении try/except?
Автор, добавлено 5.06.11, 15:47:51 
Ну, вы сами ответили на все вопросы. Такова особенность данного оператора. Мне остается только подтвердить что так и должно быть и доработать статью, чтобы подобных недомолвок не возникало. Вам спасибо!

Олег, добавлено 5.04.13, 11:40:57 
Добрый день, подскажите как мне сделать так чтоб после закрытия программы появлялась определенная форма. заранее спасибо .
 
Автор, добавлено 5.04.13, 12:16:03 
После закрытия программы не может появиться форма, может быть запущена другая программа. Есть несколько функций для запуска сторонних программ, например,

n:=WinExec('АдресПрограммы', SW_RESTORE);

При успешном запуске возвращается значение большее 31. Вот, сначала запускаете программу, затем закрываете свою.
Оставить комментарий:

Имя  

Текст комментария

  





Интернет-магазин электрооборудования