记录外部但不是自己的程序集第一次机会异常

本文关键字:程序集 第一次 机会 异常 自己的 外部 记录 | 更新日期: 2023-09-27 18:20:37

抓住自己的第一次机会异常

AppDomain.CurrentDomain.FirstChanceException += FirstChanceException;
private static void FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
    {
        // I would like to log exceptions happening outside my assembly?
        // But this event does not receive external FirstChanceExceptions
        // (unlike Visual Studio debug output)
        myLogger.Log(e.Exception);
    }

示例

  • 我想记录A first chance exception of type 'System.IO.IOException' occurred in WindowsBase.dll

  • 但不记录A first chance exception of type 'System.DivideByZeroException' occurred in MyApp.exe

解决方案

  • 有没有一种方法可以通知mscorlib.dll等dll中出现的异常
  • 请注意,感兴趣的是登录生产版本,而不仅仅是调试

为什么

在外部dll依赖项中发生的异常可能会导致问题,即使在那里进行处理也是如此。

例如,由于异常,null值可能会从外部方法返回(而不是返回x所需的输出),尽管我的代码主要处理这种异常输出,但知道到底出了什么问题以及哪里出了问题是很有用的,因为虽然我可以避免致命的异常,但null的值往往会使我的应用程序的一部分无法运行。因此,记录外部第一次机会异常将提供有价值的信息,以帮助纠正问题/将null转换为x。这可能只存在于给定的环境/特定用户等中。

记录外部但不是自己的程序集第一次机会异常

您可以使用StackTrace类来检查异常的来源:

var stackTrace = new StackTrace(e.Exception);
var sourceFrame = stackTrace.GetFrame(0);
var throwingMethod = sourceFrame.GetMethod();
var sourceAssembly = throwingMethod.DeclaringType.Assembly;
var assemblyName = sourceAssembly.GetName().Name;
bool isMyApp = assemblyName == "MyApp";