【问题标题】:Which exception to throw on discovering illegal/corrupted container object state after the fact? [closed]事后发现非法/损坏的容器对象状态时会抛出哪个异常? [关闭]
【发布时间】:2011-05-26 21:45:53
【问题描述】:

我遇到了这样一种情况,由于我调用的其他代码区域未能复制它返回的 Dictionary<TKey, TValue>,随后出现 concurrency problemDictionary 似乎包含非法的空键。

我已经修复了潜在的错误,但是为了帮助识别这个问题,如果它将来再次出现,我将添加一些代码,在处理返回的字典并抛出的循环中显式检查 null 键在事情进一步发展之前。我不确定要抛出哪个异常类,或者如果我要定义一个新的异常类,应该继承哪个。

【问题讨论】:

  • ThisShouldNeverFreakingHappenException 怎么样?
  • 我想我会把它缩写为 WtfException。 Android 声称它的意思是“多么可怕的失败”,但我们知道得更清楚。 :-)

标签: c# exception .net-3.5 compact-framework coding-style


【解决方案1】:

是否有任何调用者预期异常?任何调用者都可以处理异常吗?任何调用者都可以从异常中恢复吗?你认为投掷后会发生什么?

在这种数据结构被任意损坏的情况下,几乎没有你的不变量是已知的。您仍然在运行代码这一事实是一个奇迹。除非您有充分的理由这样做,否则我倾向于记录诊断错误并快速失败所需的任何信息。抛出异常并运行 finally 块不太可能使任何事情变得更好。

当然,你所做的任何事情最终都是权宜之计。 修复损坏数据的错误

【讨论】:

  • 已经修复了这个错误。我想我在这里要问的是,如果我发现自己已经搞砸了该怎么办——这基本上是断言失败的情况。记录并Environment.FailFast()?
  • Grr,紧凑型框架。 Process.GetCurrentProcess().Kill() 必须代替 Environment.FailFast()
【解决方案2】:

我认为IllegalStateException 应该没问题。 我知道你应该专注于让你的代码更好,这样你就不会遇到这种情况。

但是我在 DTO 上遇到了类似的问题,由于数据库上的实际对象缺少一些数据,因此无法正确初始化。 然后,当检索对象并尝试使用它时,我们捕获了 IllegalStateException 异常并且我们没有使用它,同时我们将错误发送到日志以便以后修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2019-06-10
    相关资源
    最近更新 更多