Обработка всех ошибок на уровне приложения? - PullRequest
3 голосов
/ 29 июня 2011

У меня есть форма WPF с парой кнопок, и для каждой кнопки у меня есть код обработки ошибок:

try {bla bla} 
catch(Exception e){
  more bla
}

Есть ли способ настроить что-то на уровне приложения или что-то, что будетпросто перехватить все необнаруженные ошибки и отобразить какое-нибудь общее сообщение / записать ошибку?Теперь я должен создать обработку для каждой кнопки, чтобы код не падал.Это внутреннее приложение, поэтому достаточно просто отобразить сообщение от того, что там было брошено.После этого приложение будет просто ждать следующего нажатия кнопки, чтобы потом ничего не нужно было делать.

Сейчас так много повторяющегося кода, интересно, есть ли какой-нибудь способ его консолидировать, и он касается только тех случаев, когда есть конкретный способ обработки конкретной ошибки.

С уважением, Герт-Ян

Ответы [ 5 ]

11 голосов
/ 29 июня 2011

Существует несколько возможностей:

  1. Предложения по созданию многоразового блока try / catch в C #?
  2. Если у вас есть приложение Winforms, подпишитесь насобытия Application.ThreadException и AppDomain.CurrentDomain.UnhandledException: http://www.csharp -examples.net / catching-unhandled-exceptions /
  3. Если выесть приложение WPF, подпишитесь на Application.DispatcherUnhandledException и AppDomain.CurrentDomain.UnhandledException
2 голосов
/ 29 июня 2011

Добавьте это к вам Global.asax:

protected void Application_Error(object sender, EventArgs e) {
    Exception currentException = Server.GetLastError();

    // your handling code goes here ...

    Server.ClearError();
}
1 голос
/ 29 июня 2011

Вы можете подписаться на событие AppDomain.UnhandledException (см. MSDN ), чтобы выполнить это.В идеале это происходит при начальной загрузке вашего приложения.Вы можете найти AppDomain, в котором вы выполняете, через AppDomain.Current.

0 голосов
/ 29 июня 2011

Ответ зависит от вашей платформы.В веб-приложении вы можете связать событие Application_Error в Global Asax.В WCF вы можете внедрить обработчик ошибок типа System.ServiceModel.Dispatcher.IErrorHandler в стек WCF, в приложениях форм вы можете связать событие ThreadException.

Использование его может быть хорошей идеей в некоторых ситуациях, поскольку вы не разрешаете показывать подробности исключений пользователю, но также указывает на некоторую неряшливость в отношении обработки исключений.Я использовал обработчики ошибок WCF для преобразования исключений домена в код состояния http, который прост.Является ли это хорошей практикой или нет, я не знаю.Для приложений asp.net также стоит посмотреть elmah, доступный через NuGet.

Также можно написать простой обработчик исключений, который позволит вам повторить попытку /поймать блоки, отправив подпрограммы как Func или Action как этот

    var eh = new ExceptionHandler();

    eh.Process ( () => throw new SillyException());

с классом ExceptionHandler

    class ExceptionHandler 
    { 
        public T Process(Func<T> func()) 
        {
           try { return func(); }
           catch(Exception ex) { // Do stuff }
        }

        public void Process(Action a) 
        { 
            try { action() }
            catch(Exception ex) { // Do stuff }
        }
    }
0 голосов
/ 29 июня 2011

Если это приложение WinForms, вы можете инкапсулировать вызов Application.Run () в оператор try catch, хотя я действительно не рекомендовал бы это, вы должны использовать try catches только там, где они абсолютно необходимы и иметь дело сисключения возможны, прежде чем просто полагаться на уловы.

Я знаю, что этот метод работает, хотя мне пришлось использовать его временно один раз, чтобы выполнить некоторые действия при сбое приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...