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

Ste*_*ood 2 .net c# logging exception visual-studio-2012

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

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

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

在visual studio中,你可以将IDE设置为在每次异常后中断而不管try catch,所以我想知道是否可以使用这种功能(尽管在抛出时没有破坏代码)

总之我的问题是:

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

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

C#.Net 4.5 VS 2012

Sco*_*ain 8

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

AppDomain.CurrentDomain.FirstChanceException += YourLoggingFunction;
Run Code Online (Sandbox Code Playgroud)

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

有关订阅其他AppDomain的详细信息,请参阅此MSDN页面.

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

try
{
    SomeFunctionThatThrows()
}
catch (Exception innerException)
{
    throw new SomeMoreDetailedException(message, stateDetails, innerException);
}
Run Code Online (Sandbox Code Playgroud)

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


1:这在基于网络的I/O调用中最常见,其中像a TimeoutException这样的异常会很常见,但最终用户确实需要知道发生超时错误,因为在通知用户之前可能会发生内部重试逻辑等事情.
2:您还可以通过禁用" Just My Code "并打破所有抛出的异常,在Visual Studio中看到它们.