(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Обработка исключений в Delphi

Источник: pblog
Грузин

Здравствуйте уважаемые "дельфисты" и им сочувствующие. Сегодня я вам расскажу про обработку исключений в программах на Delphi. Техника, описанная мной позволяет почти полностью контролировать выполнение сомнительного кода, который может и не сработать в самый критичный момент. Данная статья в первую очередь ориентирована на "чайников".

   Начнём сначала (это низкоуровневая часть этой статьи, кому не интересно тот может не читать). В Windows исключения обрабатываются с помощью техники SEH. Расшифровывается она так - Structured Exception Handling, т.е. структурированная обработка исключений. Суть её вот в чём. У каждого потока в некоторой области памяти (обычно она указывается сегментным регистром fs) находится связанный список, в каждом элементе которого содержатся по два указателя: один указывает на обработчик исключения, второй указывает на следующий элемент. Таким образом, получается цепочка указателей обработчики (первый элемент находится по адресу [fs]:0). При возникновении исключения (например: деление на ноль, обращение к несуществующей (невыделенной) памяти, неправильная операция над числами, неверное преобразование и т.д.) вызывается первый обработчик, он может обработать исключение и вернуть результат EXCEPTION_CONTINUE_EXECUTION т.е. "всё нормально", или если оно не может его обработать или оно предназначено для обработки других исключений оно возвращает результат EXCEPTION_CONTINUE_SEARCH, то управление будет передано следующему обработчику и так до тех пор, пока исключение не будет обработано (если уж никто не смог обработать исключение, то я думаю, последний обработчик додумается завершить приложение).

   Теперь ближе к делу. В Delphi техника SEН реализуется с помощью блока try…except/finally…end. Общий формат этих блоков такой:

    try
<код>
    except
<что будет выполнено если будет исключение>
    end
либо:
    try
<код>
    finally
<что будет выполнено в любом случае>
    end

   В втором случае видно что в цепочку обработчиков SEH будет добавлен пустой обработчик, а в первом случае в цепочку обработчиков будет добавлен указатель на блок except…end. В блоке, который следует после except можно обработать исключение, можно просто вывести сообщение об ошибке, а можно и ничего не делать. При возникновении ошибки в основном блоке управление сразу же передаётся коду, который находится в блоке except. Код, который находится после строки, которая вызвала исключение не выполнится. Если основной код слишком большой, и могут возникать различные ошибки, то можно с помощью блока on…do узнать какое именно исключение произошло. Например:

   try
       d:=56/0;
       x:=round(d);
   except
       on EInvalidOp do
           ShowMessage("деление на ноль")
       else
           ShowMessage("другая ошибка");
   end;
Можно получить детальную информацию об исключении, объявив в блоке on…do переменную требуемого класса и потом её использовать, например:
   try
       d:=56/0;
       x:=round(d);
   except
       on Excp : EInvalidOp do
           ShowMessage("ошибка под названием - "+Excp.Message)
       else
           ShowMessage("Другая ошибка");
   end;
Можно сгенерировать исключение с помощью оператора raise, например:
   type
       MyClass = class (Exception);
………
   begin
//more code
      raise MyClass.Create("любой текст");

или можно воспользоваться уже существующим классом, например raise EZeroDivide.Create("текст"). Информацию о классах исключений можно получить, набрав в справке Delphi "VCL exception classes" (там конечно не все, но для начала хватит). Следует подметить, что ошибки можно обработать только в стандартных функциях Delphi, ошибки в API функциях нельзя отловить с помощью блоков try. У API функций есть свой способ узнать об ошибке или генерировать ошибки - это API функции Set/GetLastError.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Обсудить материал в конференции Embarcadero »
Написать редактору 
 Рекомендовать » Дата публикации: 08.07.2009 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Oracle Data Access Components (ODAC) Standard single license
Обновление с КОМПАС-3D V16 Home до КОМПАС-3D v17 Home
Microsoft Windows Home 10 Russian Academic OLP 1 License No Level Legalization GetGenuine
Антивирус ESET NOD32 SMALL Business Pack renewal for 10 user. Электронный ключ
IBM DOMINO COLLABORATION EXPRESS AUTHORIZED USER LICENSE + SW SUBSCRIPTION & SUPPORT 12 MONTHS
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
Программирование в AutoCAD
СУБД Oracle "с нуля"
Работа в Windows и новости компании Microsoft
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
Обсуждения в форумах
Пишу программы на заказ для студентов (174)
Пишу для студентов на с, с++, паскаль в средах ms visual studio, qt, builder, borland c, delphi....
 
Пишу программы на заказ профессионально (2180)
Пишу программы на заказ на языках Pascal (численные методы, списки, деревья, прерывания) под...
 
И я там был (2)
И я там был, мед пиво пил, по усам текло, а в рот не попало.
 
Пишу программы на Lazarus (19)
Предлагаю разработку программ на заказ. Примеры программ: www.itproportal.ru
 
Написание оптимального кода под Delphi (1)
Delphi выполняет все почти именно так, как должен. Это как раз переизбыток "оптимизации" в...
 
 
 



    
rambler's top100 Rambler's Top100