为什么内置异常消息往往没有具体细节?(例如字典中的键)

Kio*_*iki 15 .net c# exception

我确信我已经在框架中的各种异常消息中看到了这一点.我检查了MSDN库中的以下页面,但找不到有关消息内容的更多指导:

异常抛出
错误消息设计
Exception.Message属性

第一页中可以解释它的唯一部分是这个文本:

在不要求适当权限的情况下,不要在异常消息中公开安全敏感信息.

这是由Dictionary <TKey,TValue> .Add方法抛出的ArgumentException ,它让我想起了这个问题.它看起来像这样:

System.ArgumentException : An item with the same key has already been added.
Run Code Online (Sandbox Code Playgroud)

为什么看起来不像这样?

System.ArgumentException : An item with the same key(123) has already been added.
Run Code Online (Sandbox Code Playgroud)

假设123是TKey值,基本上任何具有TKey值的格式都是我在调试时追踪错误的有用之处.

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

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

Nie*_*jes 26

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

System.ArgumentException : An item with the same key(123) has already been added.
Run Code Online (Sandbox Code Playgroud)

人们不得不假设toString关键参数有一个有效的实现.但如果是这样null呢?或者,如果它是一个自定义键,它会抛出一个新的异常toString?或者甚至一些白痴实施了一种toString方法,在10次中抛出一次随机异常?如果内部异常是由内存不足导致的,并且转换会再次触发它会怎么样?它会给不仅仅是报告它是什么,更不可预测的结果肯定是能够报告.

  • @Kaz:当然他们是可以解决的.需要付出代价.问题不在于问题是否可以解决,问题在于花钱是否是花费预算的好方法,而不是将钱花在帮助更多人的功能上. (8认同)
  • @Kaz完全没有关注点,而不是我或任何其他人所说的.我们说的是,一个好的,稳定的,可靠的框架不会在轻量级异常处理程序中使用***可能导致错误或导致其自身异常的内容.如果您想要更多信息 - 捕获基本异常并重新抛出更多信息.该框架应该******不承担风险和性能损失**默认**. (3认同)
  • 这些异议都是可以解决的.Null可以转换为类似`null`的字符串,并且异常处理可以包含在字符串转换中,在异常冒出的情况下产生替代字符串扩展. (2认同)
  • 如果将对象放入字典中,并且它们的`toString`有一个可怕的错误,那么在重复键插入期间首次发现此错误将是一个不幸的情况.这两个问题都必须修复; 解决方案不是"不要使用`toString`因为它可能是错误的. (2认同)

Kaz*_*Kaz 8

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