获取通用Windows应用程序错误

时间:2011-11-15 13:17:22

标签: c# error-handling windows-applications

如何在Application_Error

中的HttpApplication等Windows应用程序或Windows服务中获取一般发生的错误

2 个答案:

答案 0 :(得分:4)

您可以使用以下事件来捕获Windows窗体应用程序和.Net服务中的异常:

AppDomain.FirstChanceException

此事件在时触发在给定的AppDomain中存在异常,即使稍后处理该事件也是如此。这几乎肯定不是你想要的,但我认为我会把它包括在内以便完整。

请注意,这是一个per-AppDomain事件 - 如果您使用多个AppDomain,则需要为每个AppDomain处理此事件。如果您只有一个AppDomain(更有可能),则以下内容将处理此事件:

AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;

static void CurrentDomain_FirstChanceException(object sender, FirstChanceExceptionEventArgs e)
{
    throw new NotImplementedException();
}

AppDomain.UnhandledException

只要给定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?

Application.ThreadException

(仅适用于Windows窗体应用程序)

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