为什么大多数异常都会忽略特定于实例的信息?

Fra*_*ori 12 .net c# exception

我注意到大多数异常消息都不包含特定于实例的详细信息,例如导致异常的值.它们通常只告诉您错误的"类别".

例如,尝试使用第3个序列化对象时.派对库,我收到了一条带有消息的MissingMethodException:

"没有为此对象定义无参数构造函数."

在许多情况下,这已经足够了,但通常(通常在开发期间)会发出类似的消息

"没有为'Foo'类型的对象定义无参数构造函数."

通过直接指导错误原因可以节省大量时间.

InvalidArgumentException是另一个示例:它通常告诉您参数的名称,但不是它的值.这似乎是大多数框架引发的异常,也适用于第三方库.

这是故意的吗?

暴露内部状态(如变量的"错误"值)是否存在安全隐含?

Jon*_*nna 4

我能想到的两个原因:

首先,引发异常的参数可能是一个值,该值是传递给公共接口的参数的处理形式。如果不花费捕获来重新抛出在大多数方面都相同的不同异常的代价,该值可能没有意义。

其次,更重要的是,确实可能存在安全风险,这可能很难事后猜测(如果我正在编写一个通用容器,我不知道它将在什么上下文中使用) 。如果我们可以帮助的话,我们不希望“信用卡:5555444455554444”出现在错误消息中。

最终,哪种调试信息最有用将根据错误的不同而有所不同。如果类型、方法和(如果可能的话)文件和行号还不够,那么是时候编写一些调试代码来捕获您确实想知道的内容,而不是抱怨下次您时它还没有捕获可能需要不同的信息(实例的字段状态可能与参数一样有用)。