![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
К вопросу о замене System/SysInit в Delphi и обработке исключений
Игорь Шевченко © (2006-02-15 17:39:00)Дабы не уводить обсуждение в оффтопик в http://www.delphimaster.ru/cgi-bin/forum.pl?id=1139899673&n=10
Насколько я понял, в KOL решена проблема обработки использования конструкций try ... except, try ... finally и raise xxxx без использования SysUtils.
В связи с этим вопрос - можно ли с использованием подходов, примененных в KOL, определять как собственно обработчики исключений, так и фильтры, возвращающие как надо обрабатывать исключение, по образу в классической обработки SEH.
Иными словами, возможно ли писать обработчики, подобные следующему коду (на С):
__try
....
__except (ErrorCode = GetExceptionPointers()->ExceptionRecord->ExceptionCode, FooExceptionFilter (GetExceptionPointers()) {
... do some exception handling...
}
int FooExceptionFilter (EXCEPTION_POINTERS* ExceptionPointers)
{
... some processing...
return ExceptionPointers->ExceptionRecord->ExceptionCode == STATUS_STACK_OVERFLOW ?
EXCEPTION_CONTINUE_SEARCH : EXCEPTION_EXECUTE_HANDLER
}
Игорь Шевченко (2006-02-16 11:04:00) [1]
> О фильтрах, что-то возвращающих не очень понял
В той же _ExceptionHandler есть такой код
CALL UnhandledExceptionFilter
CMP EAX,EXCEPTION_CONTINUE_SEARCH
В данном случае UnhandledExceptionFilter
и есть тот самый фильтр, который что-то возвращает, согласно принципу обработки SEH.
Меня бы интересовал метод, который позволяет вызывать не жестко зафиксированный UnhandledExceptionFilter из kernel32.dll, потому что фильтр может возвратить как EXCEPTION_CONTINUE_SEARCH, так и EXCEPTION_CONTINUE_EXECUTION и EXCEPTION_EXECUTE_HANDLER
Спрашиваю на предмет, может, кто занимался этим вопросом
С наилучшими,
homm (2006-02-15 20:42:00) [2]2 Игорь Шевченко
> В связи с этим вопрос - можно ли с использованием подходов,
> примененных в KOL, определять как собственно обработчики
> исключений, так и фильтры, возвращающие как надо обрабатывать
> исключение, по образу в классической обработки SEH.
Если я не в чем не ошибаюсь...
В SEH фрейм всегда запихивается процедура из system: _ExceptionHandler. Она проверяет тип исключения - если OS, то вызывается ExceptObjProc. Эта ExceptObjProc объявлена в SysUtils или err. Именно она и определяет тип исключения и возвращает класс Exception.
О фильтрах, что-то возвращающих не очень понял, наверное давно про SEH читал, а на практике (в асемблере) не пользовался.
Игорь Шевченко (2006-02-15 18:39:00) [3]ECM © (15.02.06 18:27) [1]
Да, я его скачал по ссылке, данной в указанной ветке, но не нашел там возможности определять именно фильтр исключений. Потому и спросил. Кроме того, сдается мне, что непосредственные действия по обработке выполняются все-таки в System.pas
ECM (2006-02-15 18:27:00) [4]
> Насколько я понял, в KOL решена проблема обработки использования
> конструкций try ... except, try ... finally и raise xxxx
> без использования SysUtils.
Не совсем верно... try ... finally - да всё верно.
try ... except и raise требуют применения доп модуля Err.pas (далее выдержка из его шапки):
{
This code is grabbed mainly from standard SysUtils.pas unit,
provided by Borland Delphi. This unit is for handling exceptions,
and to use it just place a reference to exceptions unit in
uses clause of any of your unit or dpr-file.
}