拦截 C# 中的所有异常,即使它们已经被捕获 [重复]

Posted

技术标签:

【中文标题】拦截 C# 中的所有异常,即使它们已经被捕获 [重复]【英文标题】:Intercepting all exceptions in C#, even when they're already caught [duplicate] 【发布时间】:2014-10-23 16:29:06 【问题描述】:

Visual Studio 能够中断所有异常,即使它们已被捕获。注意 CLR 异常的“Thrown”下的复选框。检查时,调试器会在每个 throw 语句上中断,即使调用堆栈中的某处有 catch

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

一种糟糕的做法是扩展Exception,将一些代码放入该新类的构造函数中,并确保每个异常都扩展它。但是,这是不可行的,因为引发的许多异常甚至不是由我的代码而是由 CLR 本身引发的。

那么,关于如何引发或监听在抛出异常时引发的事件的想法,即使该异常被捕获?我所看到的只是捕获未捕获异常的各种方法,这不是我想要的。

【问题讨论】:

【参考方案1】:

你可以使用AppDomain.FirstChanceException事件。

AppDomain.Current.FirstChanceException += (sender, eventArgs) =>

    Logger.Log(eventArgs.ToString());

【讨论】:

以上是关于拦截 C# 中的所有异常,即使它们已经被捕获 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

未捕获 MySQL 异常 (C#)

C#多线程开发-处理异步操作中的异常

在我的 C# 代码中显示错误“前一个 catch 子句已经捕获了这个或超类型 `System.Exception' 的所有异常”

Android WebView:拦截重定向请求?

C#多线程开发-处理子线程中的异常

CodeIgniter 和抛出异常