Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Вниз

К вопросу о замене System/SysInit в Delphi и обработке исключений   Найти похожие ветки 

 
Игорь Шевченко ©   (2006-02-15 17:39) [0]

Дабы не уводить обсуждение в оффтопик в http://delphimaster.net/view/11-1139899673/

Насколько я понял, в 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
}


 
ECM ©   (2006-02-15 18:27) [1]


> Насколько я понял, в 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.
}


 
Игорь Шевченко ©   (2006-02-15 18:39) [2]

ECM ©   (15.02.06 18:27) [1]

Да, я его скачал по ссылке, данной в указанной ветке, но не нашел там возможности определять именно фильтр исключений. Потому и спросил. Кроме того, сдается мне, что непосредственные действия по обработке выполняются все-таки в System.pas


 
homm ©   (2006-02-15 20:42) [3]

2 Игорь Шевченко


> В связи с этим вопрос - можно ли с использованием подходов,
>  примененных в KOL, определять как собственно обработчики
> исключений, так и фильтры, возвращающие как надо обрабатывать
> исключение, по образу в классической обработки SEH.
Если я не в чем не ошибаюсь...
В SEH фрейм всегда запихивается процедура из system: _ExceptionHandler. Она проверяет тип исключения - если OS, то вызывается ExceptObjProc. Эта ExceptObjProc объявлена в SysUtils или err. Именно она и определяет тип исключения и возвращает класс Exception.

О фильтрах, что-то возвращающих не очень понял, наверное давно про SEH читал, а на практике (в асемблере)  не пользовался.


 
Игорь Шевченко ©   (2006-02-16 11:04) [4]


> О фильтрах, что-то возвращающих не очень понял


В той же _ExceptionHandler есть такой код

       CALL    UnhandledExceptionFilter
       CMP     EAX,EXCEPTION_CONTINUE_SEARCH

В данном случае UnhandledExceptionFilter
и есть тот самый фильтр, который что-то возвращает, согласно принципу обработки SEH.

Меня бы интересовал метод, который позволяет вызывать не жестко зафиксированный UnhandledExceptionFilter из kernel32.dll, потому что фильтр может возвратить как EXCEPTION_CONTINUE_SEARCH, так и EXCEPTION_CONTINUE_EXECUTION и EXCEPTION_EXECUTE_HANDLER

Спрашиваю на предмет, может, кто занимался этим вопросом

С наилучшими,



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.051 c
15-1163143100
Jeer
2006-11-10 10:18
2006.12.03
Вирус


15-1163485918
KygECHuK
2006-11-14 09:31
2006.12.03
Маленький вопрос


4-1153208832
anton1209
2006-07-18 11:47
2006.12.03
Flow control в BCD


2-1163617262
Troan_81
2006-11-15 22:01
2006.12.03
handle


2-1163504867
MishaLukash
2006-11-14 14:47
2006.12.03
TCustomDBGrid? видел только в хелпе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский