Создание NonContinuable исключения в Delphi
У меня есть исключение, которое его raise
команда вызывает переполнение стека. Я прочитал эту статью, чтобы узнать, что мне делать: http://www.debuggingexperts.com/modeling-exception-handling
То, что я понял, является исключением 0xc0000025
означает попытку поймать исключение, которое запрещено ловить (EXCEPTION_NONCONTINUABLE_EXCEPTION
). Я прав?
Если это так, я хотел бы знать, что является причиной того, что исключение определяется как непродолжительное. Исключение определено в Паскале и получено из Exception
объект.
Кроме того, я не смог найти, где обрабатывается это исключение, и добавил сам try-catch
блок. Исключение поймано успешно. Зачем?
РЕДАКТИРОВАТЬ
Я хочу объяснить конкретную ситуацию, мне нужна помощь:
Существует код C++, который вызывает код Pascal, который имеет определение исключения, и raise
команда происходит в нем.
Прежде чем поставить try-catch
блок в коде C++, raise
в Паскале вызывает 1000 раз исключение EXCEPTION_NONCONTINUABLE_EXCEPTION
пока стек не переполнится.
После того, как я добавил try-catch
блок в коде C++, raise
в коде Паскаль возвращается к catch
блок в коде C++.
Теперь у меня есть 2 вопроса:
- Почему процесс не остановился на первом
NONCONTINUABLE
исключение? - Почему
catch
блок в коде C++ не вызвал это исключение?
1 ответ
Вы правы, что EXCEPTION_NONCONTINUABLE_EXCEPTION означает, что программа попыталась продолжить работу из исключения, которое не может быть продолжено. Однако в Delphi невозможно определить такое исключение, поэтому источник вашей проблемы находится в другом месте.
Рассмотрите возможность отладки создания, поднятия, перехвата и уничтожения вашего пользовательского типа исключения. Если в вашей программе задействованы внешние библиотеки, в частности, написанные на чем-то отличном от Delphi, убедитесь, что они либо знают, что делать с внешними исключениями, либо полностью защищены от исключений.