Действительно ли возможно иметь глобальный рычаг исключения?

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

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

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

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

11
задан Heinrich Ulbricht 13 April 2010 в 10:36
поделиться

4 ответа

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

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

Для получения подробной информации см. выше объявления переменных и процедур.

16
ответ дан 3 December 2019 в 04:13
поделиться

Думаю, вы можете использовать функцию 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);
8
ответ дан 3 December 2019 в 04:13
поделиться

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

0
ответ дан 3 December 2019 в 04:13
поделиться

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

1
ответ дан 3 December 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: