Возможно ли иметь глобальный хук исключения? - PullRequest
11 голосов
/ 13 апреля 2010

мой код довольно хорошо покрыт обработкой исключений (try..except). Некоторые исключения не ожидаются, а некоторые исключения случаются довольно часто, что вполне ожидаемо. Теперь я хочу добавить несколько автоматических тестов для этого кода. Было бы хорошо узнать, сколько исключений произошло во время выполнения, поэтому я позже смогу увидеть, было ли увеличено ожидаемое число или произошло что-то неожиданное. Я не хочу загромождать каждый блок обработки исключений кодом отладки, поэтому мой вопрос:

Есть ли способ установить какой-то глобальный обработчик исключений, который находится прямо перед всеми другими блоками обработки исключений? Я ищу центральное место для регистрации этих исключений.

Спасибо за любые предложения!

(И если это имеет значение: это Delphi 2009)

Ответы [ 4 ]

15 голосов
/ 13 апреля 2010

Вы можете сделать следующее:

  • сохранить значение переменной System.RaiseExceptObjProc, которая в обычном приложении Delphi указывает на SysUtils.RaiseExceptObject
  • создайте свой собственный процесс "RaiseExceptObject" и назначьте его переменной RaiseExceptObjProc
  • в вашем собственном процессе "RaiseExceptObject" вы можете делать то, что хотите, а затем вызывать сохраненное значение RaiseExceptObjProc

Подробнее см. Выше описания переменных и процедур.

8 голосов
/ 13 апреля 2010

Я думаю, вы можете использовать API-функцию AddVectoredExceptionHandler .

Вот небольшой пример использования:

var
  f : TFileStream;

    function VectoredHandler(ExceptionInfo : PEXCEPTION_POINTERS): LongInt; stdcall;
    var 
      s : String;
    begin
      S := Format('Exception code %x address %p'#10#13, [ExceptionInfo^.ExceptionRecord^.ExceptionCode,
       ExceptionInfo^.ExceptionRecord^.ExceptionAddress]);
       f.WriteBuffer(PChar(s)^, Length(s) * sizeof(wchar));
       FlushFileBuffers(f.Handle);
      OutputDebugString(PChar(Format('ExceptionCode: %x', [ExceptionInfo^.ExceptionRecord^.ExceptionCode])));
      result := EXCEPTION_CONTINUE_SEARCH ;
    end;


    initialization
      AddVectoredExceptionHandler(0, VectoredHandler);
1 голос
/ 13 апреля 2010

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

0 голосов
/ 13 апреля 2010

JCL имеет собственный диалог исключений. Просто добавьте этот диалог в ваш проект, он будет обрабатывать все неожиданные исключения. Подробная информация находится в этой папке JCL: jcl \ experts \ debug. Также есть текстовый файл с инструкциями, который шаг за шагом описывает, как его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...