UnhandledExceptionEventArgs无效的全局异常处理程序

时间:2016-01-06 13:33:44

标签: c# .net exception-handling

在阅读this MSDN页面后,我在我的.net类库中创建了一个全局异常处理程序,用于记录目的,如下所示:

    static void OnException(object sender, UnhandledExceptionEventArgs args)
    {
        Exception ex = (Exception)args.ExceptionObject;
        Logging.LogException(ex);
    }

但是如果我从某个方法中throw new UnauthorizedAccessException()throw new Exception(),那么根本无法捕捉到它。

MSDN页面说:

  

UnhandledExceptionEventArgs提供对异常对象的访问   以及表示公共语言运行时是否为的标志   终止。 UnhandledExceptionEventArgs是其中一个参数   传入UnhandledExceptionEventHandler for    AppDomain.UnhandledException 事件

我相信我所做的事情属于AppDomain(而不是 ThreadException )?我在这里做错了什么?

PS。我试图避免try-catch阻止,因为显然是it's bad practice。这个类库是从一个定期运行的Windows服务调用的,所以我不要让它崩溃'避免因意外异常导致的内存泄漏,并希望定期监视事件日志。

2 个答案:

答案 0 :(得分:1)

您需要在当前应用程序域中安装异常处理程序才能触发:

AppDomain.CurrentDomain.UnhandledException += OnException;

否则它只是一个永远不会被调用的方法声明。

答案 1 :(得分:0)

你提到你试图避免尝试捕获,但在你的处理程序中,这不是一个坏主意:

static void OnException(object sender, UnhandledExceptionEventArgs args)
{
    try
    {
        Exception ex = (Exception)args.ExceptionObject;
        Logging.LogException(ex);
    }
    catch
    {
       // do nothing to silently swallow error, or try something else...
    }
}

...因为您不想在错误处理程序中爆炸。如果稳定性是最重要的,要么吞下,要么尝试使用二级(更基本的)测井方法来确保没有异常通过裂缝。

通常,静默吞咽异常是一种不好的做法,但这是在错误处理块中,其中失败意味着崩溃应用程序。