我有一个带有几个按钮的WPF表单,对于每个按钮,我都有错误处理代码:
try {bla bla}
catch(Exception e){
more bla
}
有什么方法可以在应用程序级别上设置一些东西,或者只是捕获所有未捕获的错误并显示一些通用消息/记录错误的东西?现在我必须为每个按钮创建处理,以便代码不会崩溃。它是一个内部应用程序,所以只显示从那里抛出的消息就足够了。之后,应用程序将等待下一次按钮单击,因此之后不必执行任何操作。
现在有很多重复代码,想知道是否有某种方法来整合它,并且只处理有特定方法来处理特定错误的情况。
关心Gert-Jan
答案 0 :(得分:10)
有多种可能性:
Application.ThreadException
和AppDomain.CurrentDomain.UnhandledException
:http://www.csharp-examples.net/catching-unhandled-exceptions/ Application.DispatcherUnhandledException
和AppDomain.CurrentDomain.UnhandledException
答案 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
。
还可以编写一个简单的异常处理程序,允许您通过以Func
或Action
这样的方式发送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并处理在依赖捕获之前,除了可能的例外情况。
我知道这种方法很有效,因为我必须暂时使用它才能清理应用程序崩溃。