我注意到大多数异常消息不包含特定于实例的详细信息,例如导致异常的值。他们通常只告诉您错误的“类别”。
例如,当尝试用 3rd 序列化一个对象时。派对库,我收到一个 MissingMethodException 消息:
"No parameterless constructor defined for this object."
在很多情况下这就足够了,但通常(通常在开发过程中)会出现这样的消息
"No parameterless constructor defined for this object of type 'Foo'."
可以直接找到错误原因,从而节省大量时间。
InvalidArgumentException 是另一个例子:它通常会告诉您参数的名称而不是它的值。 这似乎是大多数框架引发的异常的情况,但也适用于第 3 方库。
这是故意的吗?
暴露内部状态(如变量的“错误”值)是否存在安全隐患?
最佳答案
我能想到的两个原因:
首先,可能引发异常的参数是一个值,该值是传递给公共(public)接口(interface)的值的处理形式。如果没有捕获以重新抛出在大多数方面都相同的不同异常的代价,该值可能没有意义。
其次,更重要的是,确实存在安全风险,很难事后猜测(如果我正在编写一个通用容器,我不知道它将是什么上下文用于)。如果我们能提供帮助,我们不希望“信用卡:5555444455554444”出现在错误消息中。
最终,最有用的调试信息会因错误而异。如果类型、方法和(如果可能)文件和行号还不够,那么是时候编写一些调试代码来捕获您确实想知道的内容,而不是在下次您时提示它尚未捕获可能需要不同的信息(实例的字段状态可能与参数一样有用)。
关于c# - 为什么大多数异常都忽略特定于实例的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8476676/