如何在Application_Error
HttpApplication
等Windows应用程序或Windows服务中获取一般发生的错误
答案 0 :(得分:4)
您可以使用以下事件来捕获Windows窗体应用程序和.Net服务中的异常:
此事件在时触发>在给定的AppDomain中存在异常,即使稍后处理该事件也是如此。这几乎肯定不是你想要的,但我认为我会把它包括在内以便完整。
请注意,这是一个per-AppDomain事件 - 如果您使用多个AppDomain,则需要为每个AppDomain处理此事件。如果您只有一个AppDomain(更有可能),则以下内容将处理此事件:
AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
static void CurrentDomain_FirstChanceException(object sender, FirstChanceExceptionEventArgs e)
{
throw new NotImplementedException();
}
只要给定AppDomain中存在未处理的异常,就会触发此事件。同样,这是一个per-AppDomain事件,并以与FirstChanceException
事件类似的方式连接。
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
throw new NotImplementedException();
}
您可以在任何您喜欢的位置挂钩这两个事件,但是您可能希望尽快执行此操作,否则在挂接事件处理程序之前可能会抛出异常。 Main
课程中Program
方法的开头通常是执行此操作的好地方。
请注意,在Windows窗体应用程序中,如果您希望Windows事件应用程序中未处理的异常(由Windows窗体基础结构处理)处理不当,则可能不会触发此事件,因此有时不会将其作为未处理的异常传播在AppDomain中。
查看Why is my Catch block only running while Debugging in Visual Studio?
当Windows窗体应用程序中引发未处理的异常时会发生这种情况,然后由Windows窗体基础结构捕获。您可能应该使用此而不是AppDomain.UnhandledException
来捕获Windows窗体应用程序中未处理的excpetions:
Application.ThreadException += Application_ThreadException;
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
throw new NotImplementedException();
}
您希望尽快将其联系起来 - Main
课程中Program
方法的开头通常是执行此操作的好地方。
请注意,它们都不是完全,就像ASP.Net应用程序的Application_Error
方法一样,但是如果您要创建Windows窗体应用程序,那么可能想要使用Application.ThreadException
,如果您正在创建Windows服务,那么可能想要AppDomain.UnhandledException
答案 1 :(得分:1)
您可以订阅UnhandledException事件,如下所示:
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
您的代码中有一个方法,如下所示:
private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// DoSomething
}