Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

"Перехват" Exception в FreePascal (Lazarus)


swerg   (06.03.13 21:10

Сразу поясню что зачем.
Есть dll на Lazarus, в ней 500 экспортируемых функций.
Задача: возникающие в коде dll Exception не должны выходить за пределы экспортируемых функций.

Понятно, что можно (нужно?) в каждой экспортируемой функции написать шаблон вида

function SomeExportFunc(...): Integer;
begin
 try
   SomeExportFunc_body(...);
 except
   Result := ErrorCode;
 end;
end;

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

Волшебный вариант видится в том, что при возникновении Exception где-то глубоко по факту будет вызываться некая наша функция, которая будет фиксировать ошибку - а далее будет просо производиться штатный выход из SomeExportFunc().

Поизучал вот здесь
http://wiki.freepascal.org/Logging_exceptions
но как-то не особо успешно, признаться. Как сделать желаемое волшебство - все равно не понимаю, ведь в
fpc\2.6.0\source\rtl\inc\except.inc
видим следующее:

Procedure DoUnHandledException;
....
 _ExceptObjectStack:=ExceptObjectStack;
 If (ExceptProc<>Nil) and (_ExceptObjectStack<>Nil) then
   with _ExceptObjectStack^ do
     begin
       TExceptProc(ExceptProc)(FObject,Addr,FrameCount,Frames);
       halt(217)
     end;
....

т.е. какие-бы обработчики не ставил - там заканчивается все всегда одним, а именно - halt(), что, на сколько я понимаю, приводит к остановке процезза безальтернативно.

Подскажите: реализуемо ли желаемое волшебство? если да - то как именно?


DVM ©   (31.03.13 15:55[1]


> Но, как я уже написал, dll давно готова, куча экспортируемых
> функций, вставлять в каждую - тоскливо. Можно попробовать
> автоматизировать изготовление оберток,

ИМХО вставлять в каждую. Если много, то написать программу, автоматизирующую процесс. Я так и делал как то.


Rouse_ ©   (31.03.13 17:33[2]

http://msdn.microsoft.com/en-us/library/ms679274(VS.85).aspx


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо