0

Я новый программист и пытаюсь понять, как работает Delphi Application.OnException. Коллега изменил обработку исключений по умолчанию, создав свой собственный метод и создав его и передав его в Application.OnException в разделе initialization устройства. Это устройство объявлено в предложении uses другого устройства и в противном случае не используется.Сфера применения. Исключение и Delphi

unit ADLDebug; 
... 

class procedure TADLExceptionHandler.ADLHandleException (Sender: TObject; E: Exception); 
... 

initialization 
    Handler := TADLExceptionHandler.Create; 
    Application.OnException := Handler.ADLHandleException; 

Я могу только шаг в секцию initialization используя отладчик, а не в методе ADLHandleException. Я пытаюсь вызвать исключение в коде, который будет пойман с помощью переопределенного метода HandleException.

Если объем переопределенного метода HandleException будет только в единицах, которые включают ADLDebug? Я думал, что это должно быть широкое применение, но я не могу назвать это.

+0

Может быть, обработчик исключений передает некоторые (по умолчанию) исключения, чем исключения приложения, и в этом случае вы не увидите «специальный» обработчик в действии. Хотя, пройдя через стек вызовов, будет. – NGLN

ответ

3

Сфера применения. Исключение действительно широкое применение. Событие будет срабатывать всякий раз, когда возникает исключение, которое не обрабатывается.

Вы не видите огонь события, потому что вы поднимаете исключение при запуске, прежде чем цикл сообщения начнется.

+0

@peldaul: просто поднимите любое исключение, которое вы хотите, в контексте основного потока, и дайте ему пройти в RTL, если вы его не поймаете. Например, повышение непрозрачного исключения в событии 'OnClick'' TButton'. –

+0

Я создаю «повышение исключения» в своем приложении, Delphi спрашивает меня, хочу ли я сломать или продолжить. Если я выбираю Перерыв, отладчик ставит меня на линию, где был выпущен рейз. Если я тогда ударил F8, как только он доведёт меня до конца процедуры. Если я ударил его еще раз, он берет меня в код сборки в середине _HandleFinally в System.pas. –

+0

Я ожидаю, что это поместит меня в метод HandleException в Vcl.Forms.TApplication или в новый метод ADLHandleException. Почему он отправляет меня на «Ханделл»? –

Смежные вопросы