есть ли способ поймать и занести в журнал все ошибки в приложении. В тот момент, когда я использую try catch блоки в местах, где, я думаю, ошибка может произойти. Но есть ли возможность поймать все ошибки на уровне приложений (я имею в виду, могу ли я поставить блок catch try в файл проекта или, может быть, какой-нибудь другой трюк это сделает)?
Есть ли способ поймать необработанные исключения приложений и зарегистрировать их
Ответ 1
Посмотрите MadExcept. Если вы добавите его в свой проект, он автоматически установит крючки, которые поймают все необработанные исключения, сгенерируют очень информативные отчеты об ошибках и даже отправят их вам по электронной почте или отправят в веб-службу. Это лучшее, что можно было бы прикрепить отладчик к системам ваших клиентов.
Ответ 2
Вы также можете рассмотреть Eureka Log, которые сами CodeGear используются для их PHP-продукт. Журнал Eureka также обнаруживает утечку памяти и позволяет вам автоматически отправлять отчеты об ошибках, ftp'd, автоматически добавлять в систему отслеживания ошибок или разрешать интерактивную подачу аварийных сообщений.
Это не бесплатно, но я думаю, что это стоит денег. Честно говоря, я не мог себе представить, используя Delphi без него. Кроме того, они также имеют .NET-версию программы.
Одна из последних функций, которые мне нравятся, заключается в том, что вы можете настроить продукт для принятия различных действий с определенными исключениями, в то же время сохраняя других в обычном режиме. Я использую это с некоторыми исключениями Indy, которые могут быть брошены:
Ответ 3
"Ловить" исключение может означать много вещей: регистрировать его, отображать, воздействовать на него, ререйзировать его или любую комбинацию из вышеперечисленного. Обработчик TApplication OnException "поймает" все необработанные исключения основного потока, но не будет ловить исключения, возникающие в потоках. Для этого вам нужно будет внедрить собственную обработку исключений потоков. В моей структуре приложения (http://www.csinnovations.com/framework_overview.htm) У меня есть код, который гарантирует, что любое исключение может быть зарегистрировано (все необработанные исключения и, возможно, любые обработанные исключения), и опционально отображается, если он находится в основном потоке, независимо от того, происходит ли он в основном потоке или в любом другом потоке. Хотя он не такой всеобъемлющий, как MadExcept, он обладает всеми функциями, необходимыми для обработки исключений.
Ответ 4
Если вы хотите перехватить ВСЕ исключения и зарегистрировать их, вам необходимо выполнить процедуру RTLUnwindProc
низкого уровня.
Это немного низкоуровневый (например, ему нужны навыки asm), поэтому вам лучше полагаться на существующий код. См. этот вопрос.
Я даже поместил в свой собственный ответ (включая низкоуровневый asm, работающий с Delphi 7 и позже под Win32), который показывает функции регистрации, включенные в нашу инфраструктуру mORMot с открытым исходным кодом. Чтобы зарегистрировать все исключения, просто добавьте ссылку на SynCommons.pas
и добавьте следующую строку при запуске программы:
TSynLog.Family.Level := [sllException,sllExceptionOS];
В настоящее время работает с Delphi 5 до XE4 для платформ Win32 и Win64.
Ответ 5
используйте try..except block следующим образом:
try
..
// a critical section here
..
except on E:exception do
begin
showmessage('an error occured: ' + E.message);
//do something else
end
end;