为什么内建异常消息往往没有特定的细节?(例如,从字典中的键)

本文关键字:例如 字典 细节 消息 异常 为什么 | 更新日期: 2023-09-27 18:19:16

我确信我在框架中的各种异常消息中看到过这种情况。我从MSDN库中检查了以下页面,但没有找到太多关于消息内容的指导:


例外扔错误消息设计
例外。消息属性

第一页中唯一可以解释的部分是这段文字:

不要在异常消息中透露安全敏感信息不需要适当的权限

这是Dictionary<TKey,>抛出的ArgumentException。添加提醒我这个问题的方法。它看起来像这样:

System.ArgumentException : An item with the same key has already been added.

为什么它看起来不是这样的?

System.ArgumentException : An item with the same key(123) has already been added.

这里假设123是TKey值,基本上任何带有TKey值的格式都是我认为在调试时跟踪错误是有用的。

是否有一个已知的原因,为什么没有包括它?

使用消息中的键重新抛出参数异常会被认为是不好的做法吗?我曾考虑过创建自己的异常子类,但我认为在这种情况下,使用内置异常类似乎是更好的选择。

为什么内建异常消息往往没有特定的细节?(例如,从字典中的键)

根据经验,框架中的异常情况希望避免创建新的异常情况。要像这样格式化消息:

System.ArgumentException : An item with the same key(123) has already been added.

必须假设在key参数上存在toString的有效实现。但如果是null呢?或者它是一个自定义键,在它的toString中抛出一个新的异常?或者甚至一些白痴实现了一个toString方法,抛出一个随机异常的10次?如果内部异常是由内存不足情况引起的,并且转换将再次触发该异常,该怎么办?与仅仅报告确定能够报告的内容相比,它会给出更多不可预测的结果。

这看起来像是一种安全预防措施。该程序可能正在处理安全敏感数据,它会注意不将这些数据写入日志消息或通过UI显示。但是,哎呀,这里有一个问题,并且出现了一个未处理的异常,其中一些默认处理程序显示或记录该敏感信息的片段,因为它包含在异常文本中。