【问题标题】:C# does an exception object contain the actual value that caused the exception?C# 异常对象是否包含导致异常的实际值?
【发布时间】:2018-06-29 16:02:50
【问题描述】:

当 Visual Studio 报告堆栈跟踪时,我有时会收到“字符串值不是有效的 DateTime”之类的信息。这个问题与该错误无关,但是当我查看异常时,我永远找不到实际值。例如,是“3”还是“Hello”?我通常会在程序中回溯以获取它。我的问题是,当我们谈论 .NET 调用时,异常对象是否真的在某处包含导致异常的值?

【问题讨论】:

  • 有时。取决于例外情况。
  • 不,它不会,除非抛出异常的人将这些值添加到异常属性中。
  • 关于将“坏”值放入异常的有趣故事。在 .NET v1 发布之前,可能会出现异常消息“您无权获取文件 c:/foo/bar.txt 的名称”。超级,感谢您让我知道我不允许知道的文件名。显然,这得到了解决。将有问题的值放在异常中通常是个坏主意,因为异常可能会沿调用堆栈向上传播到低信任代码中。与网站不向试图破坏网站的黑客显示错误日志的原因相同!

标签: c# visual-studio exception-handling


【解决方案1】:

不,它没有。一般来说,在抛出自己的异常时,尽可能在消息中提供这一点并不是一个坏主意。但即使是标准方法也没有。就这么简单。

这就是为什么一些项目会编写大量日志文件,记录每个函数调用的所有值(可见),生成 TB 的信息,然后迅速处理。

【讨论】:

  • 总的来说,我认为这是个坏主意,主要是因为安全问题。
  • 我认为这只是一个坏主意,因为它是在语言中实现的。他们应该更改它以使开发人员更容易,可以很容易地成为发布/调试构建标志,以包含来自 .NET 的堆栈跟踪中的值。它知道这个值是无效的,所以它应该知道它是什么。如果人们可以通过功能标志看到“安全问题”方面,也许我会提出功能请求。
【解决方案2】:

这取决于异常的设计以及如何捕获此异常。

如果它可以暴露一些敏感信息,你应该避免包含这些值。

否则您可以考虑填充 Exception.Data IDictionary ,这对于错误调查非常有用。

【讨论】:

    猜你喜欢
    • 2016-07-28
    • 1970-01-01
    • 2017-10-08
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多