有没有办法在抛出CLR异常时触发事件

时间:2014-04-21 23:43:54

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

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

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

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

在visual studio中,您可以将IDE设置为在每次异常后中断,无论尝试捕获,所以我想知道是否可以使用这种功能(尽管在抛出时不会破坏代码)

总结我的问题是:

每当抛出自定义或CLR异常时,是否有办法触发调用此方法的事件(或类似方法)。

作为与此相关的奖励问题,是否可以与方法进入/退出记录类似?

C# .Net 4.5 VS 2012

1 个答案:

答案 0 :(得分:8)

如果你想调用你的函数,就像Visual Studio在第一次机会异常中破坏一样(甚至在try-catch块内部抛出),那么你需要订阅FirstChanceExecption事件。您正在运行的AppDomain

AppDomain.CurrentDomain.FirstChanceException += YourLoggingFunction;

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

有关订阅其他AppDomain的更多信息,请参阅this MSDN page

请注意,您可能会获得比您意识到的更多异常,某些.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中看到它们。