Конференция "FreePascal" » "Перехват" Exception в FreePascal (Lazarus)
 
  • swerg (06.03.13 21:10) [0]
    Сразу поясню что зачем.
    Есть 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]
 
Конференция "FreePascal" » "Перехват" Exception в FreePascal (Lazarus)
Есть новые Нет новых   [134427   +38][b:0][p:0.001]