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

标签 c# .net exception

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

例如,当尝试用 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/

相关文章:

c# - 如何用重载和覆盖方法来解释这种行为?

javascript - React.js 通过 create-react-app 与 ASP MVC 集成

.net - 我如何禁止整个公司访问我的网站?

java - 数组类的空指针异常

c# - 将 List<double> 转换为 LiveCharts.IChartValues

c# - Linq 从另一个列表中获取列表

c# - 使用 itextsharp 在现有表格/图像上写入文本

c# - 如何在不引用 EF 的情况下识别 EF POCO 代理?

c# - InvalidProgramException/Common Language Runtime 检测到无效程序

exception - 如何在 block 内临时定义条件?