Ответ 1
Ваш лучший шанс в приложении. Есть два крючка:
-
AppDomain.UnhandledException
является конечной "уловкой" -
Application.ThreadException
- это особый пользовательский интерфейс для исключений, которые произошли в потоках форм
Правильное место для "catch-all" зависит от семантики вашего приложения и трудно сказать, куда вы должны положить его, не зная своего приложения. Приложение также должно установить Application.SetUnhandledExceptionMode
.
Наличие наружной сторожевой собаки менее полезно, потому что она не может дать сколько-нибудь значимой информации, почему авария приложения. К моменту обнаружения "неожиданного" выхода (как он знает, "неожиданно"?) Слишком поздно собирать какую-либо полезную информацию. С помощью внутреннего обработчика вы можете собрать исключение и стек и отправить их в службу анализа, например bugcollect.com, а затем у вас будет но впереди в понимании только того, что произошло, но также, как часто это происходит и какое развертывание затронуто (где это происходит). Существуют и другие подобные сервисы, такие как exceptioneer.com или Отчеты об ошибках Windows (для этого требуется, чтобы ваш код был подписан сертификатом доверенного органа, таким как Verisign). Опираясь на услугу по сбору инцидентов, намного превосходит отправку почты, вы не хотите просыпаться и находите 2k инцидентов в вашем почтовом ящике и начинаете просеивать их, чтобы понять, что произошло.
И последний мир: не изобретайте колесо: уже есть много фреймворков для сбора и регистрации исключений, например log4net и elmah.