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 .