有没有一种方法可以记录或拦截第一次机会异常?

9

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


你失去的是哪些信息? - pipTheGeek
很高兴被纠正:如果您没有在每个方法中处理所有异常并确保所有变量都在try-catch块之外定义,那么在引发最终异常的时候,您将无法访问原始异常执行上下文中可用的所有变量。 - Brian Adams
3个回答

19

现在,在 .NET Framework 4.0 中,你可以订阅 AppDomain 的FirstChanceException 事件。它只是一个事件,所以你不能处理错误,但这似乎是一个很好的、集中的方法,可以获取关于异常的信息,无论它们是否被处理。在 catch 块允许处理异常之前,会触发 FirstChanceException 事件。除了微软的文档外,我没有找到很多关于它的信息,但其中一个更好的来源是Mitch Sellers 的博客


我希望在.NET 3.5中有一种方法来实现这个。我正在生产中使用一个3.5进程,像FirstChanceException这样的东西可能会帮助我追踪断开连接的问题... - Evgeniy Berezovsky

2
我认为在.NET中获得这些信息的唯一方法是使用调试器。否则,您将不得不自己开发解决方案来保存堆栈帧的状态并具有特殊的记录异常方式。基本上,您将执行内存分析器执行的相同操作,跟踪创建的实例。但是,除非限制要记录的信息量,否则这将对性能造成巨大影响。更好的解决方案是使用System.Diagnostics命名空间中的Trace和Assert功能以选择性地跟踪程序状态,或者使用日志记录设施(log4net、EnterpriseLibrary、NLog、自行编写简单设施)在进行操作时转储线程/堆栈/变量信息。无论如何,添加所有这些额外信息都会增加很大的开销。编辑:我在我的订阅源中收到了这个项目的消息:NTrace。看起来它更符合您尝试做的事情。

1
使用Adplus。它将附加一个调试器到进程,并在第一次异常发生时生成(默认情况下)一个小型minidump。Adplus生成的日志文件还将包含异常信息。只需确保您有可用的PDB以查看完整的calstack信息即可。

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