有没有办法记录或拦截第一次机会异常

问题描述 投票:0回答:3

如果不使用探查器,在运行的程序中是否有任何方法可以检测第一次机会异常?理想情况下,我想记录更详细的状态信息,这些信息在 catch 块接管最终异常后不可用。

.net exception
3个回答
20
投票

现在,在 .NET Framework 4.0 中,您可以订阅 AppDomain 的 FirstChanceException 事件。它只是一个事件,因此您无法处理错误,但这似乎是获取异常信息(无论异常是否被处理)的一种很好的集中方式。 FirstChanceException 事件在允许 catch 块处理之前引发。我还没有找到很多关于它的信息,但除了微软文档之外,更好的来源之一是Mitch Sellers Blog


2
投票

我认为在 .NET 中获取该信息的唯一方法是使用调试器。

否则,您必须自己开发一个解决方案来保存堆栈帧的状态并采用特殊的方式来记录异常。您基本上会做与内存分析器相同的事情,跟踪创建的实例。不过,除非您限制正在记录的信息量,否则这将对性能造成巨大影响。

更好的解决方案是使用 System.Diagnostics 命名空间中的 Trace 和 Assert 功能来有选择地跟踪程序状态,或者使用日志记录工具(log4net、EnterpriseLibrary、NLog,滚动您自己的简单工具)来转储线程/堆栈/ 随时变化的信息。

无论如何,添加所有这些额外信息都是很大的开销。

编辑:我在我的提要中得到了这个项目的新闻:NTrace。看起来它更适合您想要做的事情。


1
投票

使用Adplus。 它将在进程中附加一个调试器,并在第一次出现机会异常时生成(默认)一个小型小型转储。 Adplus 生成的日志文件还将包含异常信息。只需确保您有 PDB 即可查看完整的 calstack 信息。

© www.soinside.com 2019 - 2024. All rights reserved.