在应用程序级别上捕获所有错误处理?

时间:2011-06-29 10:12:06

标签: c# wpf

我有一个带有几个按钮的WPF表单,对于每个按钮,我都有错误处理代码:

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

有什么方法可以在应用程序级别上设置一些东西,或者只是捕获所有未捕获的错误并显示一些通用消息/记录错误的东西?现在我必须为每个按钮创建处理,以便代码不会崩溃。它是一个内部应用程序,所以只显示从那里抛出的消息就足够了。之后,应用程序将等待下一次按钮单击,因此之后不必执行任何操作。

现在有很多重复代码,想知道是否有某种方法来整合它,并且只处理有特定方法来处理特定错误的情况。

关心Gert-Jan

5 个答案:

答案 0 :(得分:10)

答案 1 :(得分:2)

将此内容添加到Global.asax

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

    // your handling code goes here ...

    Server.ClearError();
}

答案 2 :(得分:1)

您可以订阅AppDomain.UnhandledException事件(请参阅MSDN)来完成此操作。理想情况下,这会在引导您的应用程序时发生。您可以通过AppDomain.Current找到正在执行的AppDomain。

答案 3 :(得分:0)

答案取决于您的平台。在Web应用程序中,您可以绑定Global Asax中的Application_Error事件。在WCF中,您可以将类型为System.ServiceModel.Dispatcher.IErrorHandler的错误处理程序注入到WCF堆栈中,在表单应用程序中可以绑定ThreadException事件。

在某些情况下使用它可能是一个好主意,因为您不会向用户显示异常详细信息,但也表示有关异常处理的某种不稳定性。我使用WCF错误处理程序将域异常转换为http状态代码,这很简单。不管它是不是很好,我不知道。对于asp.net应用程序,还值得通过NuGet查看elmah

还可以编写一个简单的异常处理程序,允许您通过以FuncAction这样的方式发送reoutines来重复try / catch块

    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 }
        }
    }

答案 4 :(得分:-3)

如果它是一个WinForms应用程序,你可以在try catch语句中封装Application.Run()调用,虽然我真的不推荐这个,你应该只使用它们绝对需要的try catch并处理在依赖捕获之前,除了可能的例外情况。

我知道这种方法很有效,因为我必须暂时使用它才能清理应用程序崩溃。