重载的 Publish 方法被调用,它不仅采用异常对象,而且还采用一个名-值项集合(这些项可以在发布异常时指定其他重要数据)。ManagedExceptionLoggerTask 辅助线程使用该方法来添加异常引发的日期和时间。
ExceptionPublisher 类还利用了其他一些最佳技术。这包括对类和接口使用显式 GUID,以及从自定义接口派生而不是使用默认的类接口。有关这些技术的详细信息,请参阅 .NET and COM: The Complete Interoperability Guide。通过提供默认构造函数和一个用于发布异常的公共非静态方法,我已经创建了一种容易的方式,以便 COM 客户端使用我的类来发布异常:
IExceptionPublisherPtr spExceptionPublisher(__uuidof(ExceptionPublisher));
spExceptionPublisher->Publish(spException, spNameValueItems);
返回页首
回退日志记录
如果无法使用异常块发布 .NET 异常(由于诸如无法创建对象或权限不足等原因),则应当尝试直接记录到事件日志中。如果这种办法也失败,则最后一个办法是将异常写到调试窗口中。有趣的是,如果 ExceptionPublisher 的 Publish 方法失败,则必须将两个异常记录到事件日志中。第一个异常是从 Publish 方法中引发的 .NET 异常(它包含有关 Publish 方法失败原因的信息),第二个异常是被记录的实际异常。
第一个异常实际上可以使用本文开头介绍的、Adam Nathan 的技术提取,因为这里使用了早绑定 COM 客户端来调用 .NET 组件。.NET 异常是通过查询 _Exception 接口直接从错误对象中提取的。
异常信息被在 CManagedExceptionLoggerTask::LogExceptionToEventLog 方法中添加到事件日志中。该方法的工作方式类似于 Publish 方法,即提取所有内层异常并且为每个异常写出堆栈跟踪。如果在记录到事件日志的过程中发生任何错误,则会将原因和异常信息写到调试窗口中。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/