在C#中拦截所有异常,即使它们已经被捕获

4
Visual Studio可以在所有异常中断,即使它们被捕获。请注意“Thrown”下方的CLR异常复选框。当它被选中时,调试器会在每个throw语句上中断,即使调用堆栈中有catch。

Visual Studio中的异常处理

那么,在代码中是否也有这样做的方法呢?我正在64位类库中使用.NET 4.5.1。我的目标是记录每个异常及其堆栈跟踪。这样,当我在没有Visual Studio的计算机上测试我的程序时,我可以得到抛出异常的日志,即使我通过向用户显示对话框来处理异常。我的程序是多线程的,因此它需要在任何线程中抛出异常时引发事件。

一种可怕的方法是只需扩展Exception,在新类的构造函数中放入一些代码,并确保所有异常都扩展它。但是,考虑到许多异常甚至都不是由我的代码而是由CLR本身抛出的,因此这是不可行的。

那么,有什么想法可以引发或侦听在抛出异常时引发的事件,即使该异常被捕获?我看到的只有各种捕获未捕获的异常的方法,这不是我想要的。

1个回答

13
你可以使用 AppDomain.FirstChanceException 事件。
AppDomain.Current.FirstChanceException += (sender, eventArgs) =>
{
    Logger.Log(eventArgs.ToString());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接