15

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

Exception Throwing
错误消息设计
Exception.Message 属性

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

请勿在未要求适当权限的情况下在异常消息中披露安全敏感信息。

是Dictionary<TKey, TValue>.Add 方法抛出的 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 值的格式都是我在调试时跟踪错误有用的东西。

是否有已知的原因不包括在内?

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

4

2 回答 2

26

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

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

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

于 2013-06-19T17:28:15.810 回答
8

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

于 2013-06-19T17:37:53.013 回答