看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!
在基于异常的语言中,堆栈跟踪是用于诊断问题最重要的工具之一。在某些情况下,开发人员能得到的仅为一条简短的错误信息以及堆栈跟踪,尤其是当个人可识别信息(PII)约束限制了日志记录的内容时。
随着任务并行库(TPL)的出现以及紧随其后的 async/await 函数,堆栈跟踪变得愈发难以理解。 有效信息被隐藏起来的问题并不罕见。
事实上,该提升不可小觑。 在.NET 4.5 早期版本以及引入 ExceptionDispatchInfo 类之前,堆栈跟踪是无法跨越异步边界的,开发人员将不得不深入探究内部异常问题。但所需研究的工作远不止于此。
Illyriad 游戏开发者 Ben Adams 自行对.NET Core 2.1 中的堆栈跟踪进行了改进提升。他的工作主要集中在以下这些领域:
- 消除由于 async/await 报警引入的噪音;
- 显示哪些方法重载是在异步或迭代器上下文中被调用的;
同时,Anirudh Agnihotry 更新了 Dictionary / ConcurrentDictionary 所采用的 KeyNotFoundException,以指出哪个关键字还未被发现,这曾是使.NET 开发人员重新回到 1.0 版本的主要困扰。
如果您已在使用.NET Framework,或不想再继续等待.NET Core 2.1 版本,那么你还可以通过调用 Ben.Demystifier 库以使用 Ben 的工作成果。这种方式可超越.NET Core 更新后可满足的功能,并使堆栈跟踪代码更接近于原始 C#代码,拥有更好的可读性。 (对于.NET Core 而言,这并不能算是可选方式之一,因为在 VB 或 F#堆栈跟踪中出现 C#关键字意义不大)。
.NET Core 是以 MIT 许可证发布的。 Ben.Demystifier 采用 Apache 许可。
查看英文原文: Cleaner Stack Traces in .NET/.NET Core
感谢冬雨对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论