【问题标题】:Global exception handler with UnhandledExceptionEventArgs not workingUnhandledExceptionEventArgs 的全局异常处理程序不起作用
【发布时间】:2016-04-10 14:53:16
【问题描述】:

阅读 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 的 AppDomain.UnhandledException 事件

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

PS。我试图避免try-catch 块,因为显然it's bad practice。此类库是从定期运行的 Windows 服务调用的,因此我宁愿不要让它“崩溃”以避免由于不可预见的异常而导致内存泄漏,并且更愿意定期监视事件日志。

【问题讨论】:

  • 这个方法本身什么都不做。您订阅了 UnhandledException 事件吗?如果您通过阅读链接的问答得出的结论是“使用 try-catch 是不好的做法”,那么您可能需要再次阅读。
  • 是的,这就是问题所在。虽然我没有main 方法,但我应该在哪里订阅?至于附件,它用粗体表示。我确实同意它详细说明,但即使答案谈到日志记录,它也会谈到日志记录并允许应用程序崩溃。我正在努力避免这种情况。
  • 它说“没有充分的理由”。无论如何,您不应该从类库中执行此操作。如何处理异常取决于消费应用程序。

标签: c# .net exception-handling


【解决方案1】:

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

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

...因为您不想在错误处理程序中爆炸。如果稳定性是最重要的,要么吞下,要么尝试次要(更基本的)日志记录方法,以确保不会出现任何异常。

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

【讨论】:

    【解决方案2】:

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

    AppDomain.CurrentDomain.UnhandledException += OnException;
    

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

    【讨论】:

    • 是的,这就是您订阅事件的方式。然而,即使他们已经接受了这个答案,它也不是解决 OP 问题的方法。 UnhandledException 事件仅向您提供未处理异常的通知。您将无法在此处 处理 它,并且您绝对不想在 OP 声称正在编写的 库代码 中执行此操作,因为您'将收到应用域中所有个未处理异常的通知。
    猜你喜欢
    • 2021-12-05
    • 2014-04-17
    • 2012-12-31
    • 2011-05-19
    • 2011-08-31
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多