拦截 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# 中的所有异常,即使它们已经被捕获 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在我的 C# 代码中显示错误“前一个 catch 子句已经捕获了这个或超类型 `System.Exception' 的所有异常”