Как отключить все исключения в Delphi?

Есть ли способ отключить все диалоговые окна при возникновении исключения или ошибки (например, нарушения прав доступа, ошибки indy socket, тайм-ауты и т. д.)? В моей программе они иногда вылетают, но эти ошибки никак не фатальные и их можно игнорировать, только диалоговые окна мешают. Я использую Делфи 7.


person user1262737    schedule 13.06.2012    source источник
comment
Можно отловить все исключения, но это совершенно неправильно, а писать такой код — полный непрофессионализм. Нарушение прав доступа всегда является чем-то неправильным и должно быть обработано.   -  person LukLed    schedule 13.06.2012
comment
Вам не приходит в голову, что вам лучше исправить ошибки в вашей программе? Предположение о том, что нарушения прав доступа можно просто игнорировать, совершенно нелепо. В вашей программе есть ошибки, и нужно их исправить.   -  person David Heffernan    schedule 13.06.2012
comment
Вы правы насчет нарушений прав доступа, возможно, это было что-то еще (не помню, такое встречается очень редко). Я знаю, что в нем много ошибок, это что-то вроде пре-альфа-версии 0.1 бота, выполняющего некоторые повторяющиеся задачи, подобные краудсорсингу, много ошибок, но он уже выполняет свою работу. Я просто хотел временное решение, чтобы запустить его более безупречно, прежде чем я все оптимизирую. В любом случае спасибо за ответы.   -  person user1262737    schedule 14.06.2012
comment
@user1262737 user1262737, пожалуйста, примите во внимание все, что написано выше и ниже (и комментарии, и ответы), иначе ваше приложение будет продолжать усложняться, и в какой-то момент его будет дешевле переписать, чем продолжать.   -  person    schedule 14.06.2012
comment
Это напрашивается на неприятности, а вовсе не хорошая идея.   -  person    schedule 14.06.2012
comment
Просто для резервного копирования всех остальных - исправьте ошибки! Это единственный путь к прогрессу. Эффективно используйте исключения — в моем текущем встроенном задании нет обработки исключений, и очень сложно найти критические ошибки.   -  person Martin James    schedule 14.06.2012
comment
Хотя я согласен с тем, что нарушения доступа и некоторые другие исключения являются ошибками и должны быть удалены, а не проигнорированы, мне интересно, как LukLed собирается обрабатывать нарушения доступа?   -  person Rudy Velthuis    schedule 14.06.2012


Ответы (4)


Если вы просто не хотите показывать окно исключения, перейдите к:

Инструменты/Параметры/Параметры отладчика/Исключения языка и отключите флажок Уведомлять об исключениях языка. Это справедливо для Delphi 2010.

(Я не помню, тот ли это CheckBox в Delphi 7).

РЕДАКТИРОВАТЬ: В некоторых случаях исключения неизбежны, особенно когда мы работаем с неизвестными файлами из Интернета. Итак, я считаю, что ваши исключения правильно обрабатываются в Indy, просто отключите Уведомлять об исключениях языка

person GJ.    schedule 13.06.2012
comment
В Delphi 7 это похоже на Инструменты --> Параметры отладчика --> Языковые исключения --> снимите флажок «Остановить исключения Delphi». - person Hendra; 14.06.2012

Вы можете настроить событие Application.OnException. Но ИМХО...

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

А также:

  • Нарушения прав доступа являются фатальными ошибками — вы должны отследить и избавиться от всех AV.
  • Вы не можете скрыть диалоги исключений только путем переопределения Application.OnException - вы должны правильно использовать try finally/except.
person g2mk    schedule 13.06.2012
comment
Вы не можете просто замести исключения под коврик - вы должны правильно использовать try finally/except. Что ж, правильный путь - не использовать try/except..... - person David Heffernan; 13.06.2012
comment
@DavidHeffernan try/except полностью действителен, если вы использовали его правильно. Например. не для того, чтобы подметать под ковер все, что покрывает try..кроме end;, а для фактической обработки различных исключений. - person Harriv; 13.06.2012
comment
@DavidHeffernan: Вы имеете в виду try {...}, кроме {обработки любого возможного исключения} end, или что-то не так с try {}, кроме E: ESpecificException do {обработка только определенного исключения} end, о котором я не знаю? - person g2mk; 13.06.2012
comment
Почему вы хотите обрабатывать исключения? Пусть он поднимется к обработчику исключений верхнего уровня и обработает его там. Иногда бывают исключения из этого эмпирического правила, но это отправная точка. - person David Heffernan; 13.06.2012
comment
@DavidHeffernan: Подметая под ковер, я имею в виду скрытие диалогов исключений только с помощью переопределения Application.OnException, но у вас есть некоторые очки. Я улучшу свой ответ завтра... - person g2mk; 14.06.2012
comment
@DavidHeffeman - try/except является допустимым инструментом программирования, имхо, как и все другие операторы. Я использую его, чтобы определить, какие наборы данных действительны в определенном вычислении. Если вычисление происходит за исключением набора данных, это недействительно. если нет, набор данных действителен. Это хороший способ просмотреть большое количество наборов данных и отметить правильные. - person Arnold; 14.06.2012

Обход события Application.OnException. Однако я бы НЕ рекомендовал скрывать каждое исключение, ИМХО, это плохой дизайн.

person GDF    schedule 13.06.2012

@ GJ - в Delphi 2007 есть этот флажок. Но опять же, как упоминалось выше, нарушение прав доступа — это не те исключения, которые следует игнорировать.

person magarwal    schedule 14.06.2012