MadExcept для Delphi не печатает трассировку стека после сбоя приложения
Подробный вопрос:
Мы пытаемся перехватить трассировку стека (bugreport.txt) с помощью MadExcept в приложении delphi, где поток завершает работу приложения с фатальной ошибкой. Но MadExcept не печатает никакой трассировки стека после сбоя приложения. Есть идеи почему?
НАШ КОД:
procedure TMainForm.WSServerExecute(AContext: TIdContext);
begin
try
HTMLExecute(AContext);
except
on E: Exception do
begin
if not(E is EIdException) then
begin
LogData.AddError('HTMLExecute error: ' + E.Message);
madExcept.HandleException;
end;
raise;
end;
end;
end;
Эта процедура вызывается, когда клиент устанавливает соединение веб-сокета с сервером. Это поток, созданный компонентом Indy TCPServer. Функция HTMLExecute - это то, что читает и записывает пакеты между клиентом и сервером. Я обернул это в блок try..except, чтобы перехватить любые исключения. Строка LogData - это то, что записывает ошибку в журнал ошибок, а строка madExcept должна создать файл bugreport.txt. Строка Raise передает исключение обратно в Indy, чтобы она знала, что произошла фатальная ошибка, и прерывает поток.
2 ответа
Причина, по которой madExcept не обрабатывает исключение, заключается в том, что вы уже поймали его с on E:Exception do
справиться с этим самостоятельно. Просто дайте madExcept.HandleExcept исключение для обработки:
madExcept.HandleException(etNormal, E);
Вы можете попробовать использовать RegisterHiddenExceptionHandler(stDontDync)
, Смотрите документацию для более подробной информации. В вашем обработчике просто сделайте это:
procedure YourHiddenExceptionHandler(const exceptIntf: IMEException; var handled: boolean);
begin
handled := false;
end;
Вышеприведенный трюк заставляет madexcept работать и с обработанными исключениями, конечно, рискованно использовать его в производстве...