【问题标题】:Is there a way to fire an event whenever a CLR exception is thrown有没有办法在抛出 CLR 异常时触发事件
【发布时间】:2014-06-06 03:16:15
【问题描述】:

我被要求将错误日志记录添加到每当抛出异常时都会记录的应用程序。

我有一个执行日志的方法,我可以在每个 Catch 子句中调用它。

这似乎很愚蠢,因为应用程序中有数百个 try catch 语句。

在 Visual Studio 中,您可以将 IDE 设置为在每次异常后中断,而不管尝试捕获如何,所以我想知道是否可以使用这种功能(尽管在抛出时不会断点代码)

总之我的问题是:

有没有办法在引发自定义或 CLR 异常时触发会调用此方法的事件(或类似事件)。

作为与此相关的附加问题,是否可以对方法进入/退出日志记录进行类似操作?

C# .Net 4.5 对比 2012

【问题讨论】:

  • "I have been asked to add error logging to an application that logs whenever an exception is thrown." 很明显,请求这个的人不知道他们在问什么。
  • @JonathonReinhart:我的猜测是应用程序有时会在生产中崩溃,他们不知道为什么。希望他们真的打算记录未处理的异常。
  • 您真的想在每次抛出异常时触发事件,还是想在有未处理的异常时触发事件?强调“未处理”

标签: c# .net exception visual-studio-2012 logging


【解决方案1】:

如果您希望调用您的函数,就像 Visual Studio 在第一次机会异常时中断的方式(即使在 try-catch 块内也会中断),那么您需要订阅 @ 中的 FirstChanceExecption 事件987654325@你正在运行。

AppDomain.CurrentDomain.FirstChanceException += YourLoggingFunction;

您需要为程序中的每个 AppDomain 执行此操作,但除非您执行非常见任务,否则 99% 的程序可能只有一个 AppDomain

如果您正在使用其他 AppDomain,请参阅 this MSDN page 了解有关订阅其他 AppDomain 的更多信息。

请注意,您可能会遇到比您意识到的更多的异常,一些 .NET 框架代码会在内部抛出异常,并且只是将代码放在 try-catch 块中,因此它永远不会浮出水面1 或如果库代码有模式

try
{
    SomeFunctionThatThrows()
}
catch (Exception innerException)
{
    throw new SomeMoreDetailedException(message, stateDetails, innerException);
}

订阅该事件将导致您开始看到SomeFunctionThatThrows()throw new SomeMoreDetailedException( 引发的异常2


1:这在基于网络的 I/O 调用中最常见,其中TimeoutException 之类的异常很常见,但最终用户确实需要知道发生了超时错误,因为可能存在内部重试之类的事情在通知用户之前发生的逻辑。
2:您还可以通过禁用“Just My Code”并中断所有抛出的异常来在 Visual Studio 中查看它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    相关资源
    最近更新 更多