Если поведение изменяется внутри и снаружи отладчика, то на самом деле не ваша программа говорит вам об исключениях. Я написал об этом явлении на моем веб-сайте:
Почему я продолжаю получать сообщения об ошибках даже после написания обработчика исключений?
Выдержка:
В своих настройках по умолчанию IDE Delphi уведомляет вас о возникновении исключения в вашей программе .... Важно понимать, что на данный момент нет кода обработки вашей программы еще не запущен. Это все сам Delphi; его особый статус отладчика позволяет ему получать первое уведомление о любом исключении в вашей программе, даже до того, как ваша программа узнает об этом.
После того, как вы отклоните окно сообщения Delphi, выполнение будет приостановлено на лучшей строке вашего исходного кода, которую Delphi может найти в качестве источника исключения. Нажмите кнопку «Выполнить», чтобы возобновить работу вашей программы. Контроль перейдет к следующему окончательно или кроме
блок. Прежде чем вы возобновите свою программу, вы можете использовать различные инструменты отладки в вашем распоряжении. Вы можете проверить значения любых переменных в области видимости и даже изменить их значения.
Итак, как вы уведомляете Delphi, что вы уже обработали исключение? Вы этого не сделаете - потому что ваша программа еще не обработала ее . И почему отладчик не может определить, собирается ли ваша программа обработать исключение? Потому что для этого нужно выполнить вашу программу дальше. Обнаружение отсутствия обработчика исключений похоже на решение проблемы остановки. Единственный способ определить, будет ли обрабатываться исключение, - это запустить программу и посмотреть, будет ли обработано исключение. Но к этому моменту уже слишком поздно делать какую-либо отладку, поэтому у отладчика нет иного выбора, кроме как приостановить вашу программу, когда он сначала обнаруживает исключение, а затем позволяет вам выяснить, что делать дальше.
Моя статья описывает некоторые способы, которые позволяют избежать отладчика перехвата определенных исключений, кратко изложенные здесь:
- Используйте расширенные контрольные точки , чтобы временно отключить исключения для определенных областей кода.
- Настройте отладчик на игнорирование определенных классов исключений (и их потомков).
- Скажите отладчику не уведомлять вас о любых исключениях.
- Отключить встроенную отладку в целом.
Есть еще один вариант, который я не включил в свою статью:
- Измените вашу программу так, чтобы исключение не возникало в первую очередь.
Вы говорите, что проверяете числовой ввод. Мне кажется, что вы делаете что-то вроде вызова StrToInt
, а затем перехватываете исключение EConvertError
, когда ввод не является действительным целым числом. Это дорогой способ проверки ввода. Вместо этого используйте TryStrToInt
, который сообщит вам, успешно ли выполнено преобразование, или StrToIntDef
, который вернет значение по умолчанию, а не вызовет исключение. Другой вариант - просто старый Val
, который пытается преобразовать строку, и в случае неудачи он сообщает, какая позиция в строке вызвала сбой. Val
особенно полезно, если вы хотите использовать как можно больше символов для преобразования, а затем продолжить анализ следующего нечислового символа.