【问题标题】:Is there a built in .NET exception that indicates an illegal object state?是否存在指示非法对象状态的内置 .NET 异常?
【发布时间】:2010-09-20 13:29:48
【问题描述】:

如果我遇到非法状态,我应该抛出什么异常——例如,一个只应该被调用一次的初始化方法被第二次调用?我真的没有看到任何有意义的内置异常。这似乎应该在框架中 - 我是不是在正确的地方戳?

【问题讨论】:

    标签: c# .net exception


    【解决方案1】:

    InvalidOperationException 可能吗?

    当方法调用对于对象的当前状态无效时引发的异常。

    【讨论】:

    • 越来越多的人应该使用 InvalidOperationException 而不是创建新的。
    • True,或者至少从它派生,以便捕获 InvalidOperationException 也捕获派生的。查看从 IOE(MSDN 底部)派生的异常,看看什么时候可以自己动手。
    • 视情况而定。毕竟,您正在尝试执行无效操作,但有很多方法可以命名它。
    • 那么,如果无论对象处于什么状态,调用总是无效,你会期待什么?
    • @Joshua 在我看来,System.NotSupportedExceptionSystem.NotImplementedException 取决于实际情况。如果永久“不可用”的方法永远不应该是有效的调用,我会考虑 NotSupportedException。并在临时缺少实现或缺少实际实现的上下文相关对象状态时使用 NotImplementedException。
    【解决方案2】:

    一般来说,您应该以这样的方式对您的对象进行编程,它不会达到无效状态。如果您发现您的对象处于无效状态,那么您应该抛出一个SystemException 或从SystemException 直接派生的异常。这是标题中问题的答案。

    但是,您在问题文本中提及的例外情况是您的对象的用户将其推入非法状态。在这种情况下,InvalidOperationException 是正确的抛出异常,如this earlier answer 所示。这将避免您的对象进入非法状态。

    不用说你需要记录你的对象应该如何被使用。如果您的对象具有较长的预期寿命,或者如果它在不同对象之间使用/共享,那么用户能够请求当前状态并实现ToString 以将当前状态作为文本检索是很好的,例如在调试环境/日志中。

    【讨论】:

      【解决方案3】:

      如果我想说 System.InvalidProgramException 最接近你想要的。抛出自定义异常有什么问题?

      【讨论】:

      • IPE:“当程序包含无效的 Microsoft 中间语言 (MSIL) 或元数据时引发的异常。通常这表明生成程序的编译器中存在错误。”。使用标准异常可以围绕框架和第三方应用创建一致性。
      • 如果框架中没有任何内容支持您的案例,那么自定义异常没有任何问题。我可以写一个自定义的 ArrayList,但我为什么要写呢?
      • 好的,就像 pYrania 我也不明白为什么你认为这很重要?您必须编写一些代码来实现ArrayList,但这不能与创建自定义异常相比...
      • 重点是你不应该复制现有的功能。如果我抛出一个自定义异常,那是使用我的库的程序员必须学习的另一件事。如果我遵循框架的约定,我允许他们利用他们现有的知识。
      • 是的,但是您应该为您的库编写文档。考虑到这一点,对于用户来说,你抛出的异常是 Exception1 还是 Exception2 并不重要。
      猜你喜欢
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 2017-12-06
      • 1970-01-01
      相关资源
      最近更新 更多