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

时间:2012-01-16 13:33:48

标签: c# .net exception exception-handling appdomain

追赶自己First Chance Exceptions

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 。这可能仅存在于给定的环境/特定用户等...

1 个答案:

答案 0 :(得分:2)

您可以使用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";