Исключение захвата в Delphi Application.OnException перед попыткой, кроме блока

Я хочу регистрировать каждую программу Project ; использует Vcl . Формы , Unit1 в 'Unit1.pas' {Form1} , Logger в 'Logger.pas' , JCLDebugHandler в 'JCLDebugHandler.pas' ; {$ R * .res} begin Application . Инициализировать ; Приложение . OnException : = TApplicationException . AppException ; Приложение . MainFormOnTaskbar : = True ; Приложение . CreateForm ( TForm1 , Form1 ); Приложение . Run ; конец . ион, поднятый в приложении delphi. Для этого я переопределил событие Application.OnException одним из своих собственных исходных кодов проекта.

try..except

Это работает отлично, но я не могу поймать это решение исключениями, зацепившимися в блок try-except.

Когда исключение пойманный в за исключением блока, он просто не инициирует попробовать : = 42 / 0 ; кроме EDivisionByZero делать начинают Войти . i ( «Забито глупое деление на нулевую ошибку» ); повышение ; конец ; конец ; мероприятие.

Есть ли какой-либо способ сначала поймать его в исключение, а не за исключением блока?

delphi,try-catch,onexception,

0

Ответов: 2


6

Application.OnExceptionОбработчик вызывается только для необработанных исключений.

Необработанное исключение - это случай, когда ни один блок не поймал исключение или где он был пойман, а затем повторно поднят.try a := 42 / 0; except on EDivisionByZero do a := 0; end;

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

try..except

В этом случае исключение поймано, но приложение не имеет стратегии для обработки исключения, поэтому просто регистрирует, что оно произошло, а затем повторно вызывает исключение. Выполнение будет продолжено в любом внешнем exceptблоке. Если их нет, или, если они существуют, также восстановят исключение, то в конечном итоге исключение достигнет Application.OnExceptionобработчика.

Но обработчик исключений, возможно, не нуждается в повторном создании исключения:

Application.OnException

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

Так как исключение не было повторно поднято, выполнение продолжается (после Application.OnExceptionблока), как если бы исключение никогда не происходило в первую очередь. Вы Application.OnExceptionникогда не узнаете об этом.

Вкратце: Application.OnExceptionваш последний шанс справиться с необработанным исключением. Это не первая возможность ответить на любое исключение.

Перехват исключений в момент их возникновения, прежде чем любой код приложения имел возможность реагировать или иметь дело с ними , возможен, но это довольно продвинутый материал, и простой механизм не предоставляется «из коробки».

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

Популярным для Delphi, который вы, возможно, захотите проверить, является madExcept .


0

Я, наконец, использовал JCL для захвата и регистрации всех моих исключений. Я создал новый .pas-файл со следующим кодом:

/// <summary>
/// Inicializa JCL para capturar la informacion necesaria de la excepcion.
/// </summary>
initialization
   JclAddExceptNotifier(SetExceptionError);
   JclStackTrackingOptions := JclStackTrackingOptions + [stExceptFrame];
   JclStartExceptionTracking;

/// <summary>
/// Finaliza la notificacion de JCL luego de capturar la informacion necesaria de la excepcion.
/// </summary>
finalization
   JclRemoveExceptNotifier(SetExceptionError);
end.

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

Дельфы, попробуй поймать, OnException,
Похожие вопросы