记录外部但不是自己的程序集第一次机会异常
本文关键字:程序集 第一次 机会 异常 自己的 外部 记录 | 更新日期: 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";