мой код довольно хорошо покрыт обработкой исключений (попытка.. кроме). Некоторых исключений, как ожидают, не произойдет, и некоторые исключения происходят справедливо часто, который ожидается и хорошо. Теперь я хочу добавить некоторые автоматизированные тесты для этого кода. Было бы хорошо знать, сколько исключений произошло во время выполнения, таким образом, я могу позже видеть, было ли ожидаемое число увеличено, или что-либо неожиданное произошло. Я не хочу создавать помехи каждому блоку обработки исключений кодом отладки, таким образом, мой вопрос:
Существует ли способ установить некоторый глобальный обработчик исключений, который находится прямо перед всеми другими блоками обработки исключений? Я ищу центральное место для входа этих исключений.
Спасибо за любые предложения!
(И если это имеет значение: это - Delphi 2009),
Вы можете сделать следующее:
Для получения подробной информации см. выше объявления переменных и процедур.
Думаю, вы можете использовать функцию 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);
JCL имеет собственное диалоговое окно исключения. Просто добавьте этот диалог в свой проект, он будет обрабатывать все неожиданные исключения. Подробная информация находится в этой папке JCL: jcl \ experts \ debug. Существует также текстовый файл с инструкциями, в котором пошагово описано, как им пользоваться.
Вы можете добавить пользовательский обработчик к madExcept, который позволит вам получить полную трассировку стека, а также продолжить работу.