类状态无效时会引发什么错误?

Rei*_*ica 25 python exception

在Python类中,当在运行该方法之前必须更改类的某些其他属性时,我应该从实例方法中引出什么类型的错误?

我来自我将使用的C#背景InvalidOperationException,"当方法调用对于对象的当前状态无效时引发的异常",但我在Python中找不到等效的内置异常.

ValueError当问题出在函数参数时,我一直在提高("当内置操作或函数接收到具有正确类型但不适当值的参数时引发").我认为这在技术上是self参数的无效值; 这是治疗它的正确方法吗?例如,这是惯用的:raise ValueError("self.foo must be set before running self.bar()")

Dae*_*yth 27

ValueError在这种情况下提出是最好的事情.对于python,您应该更喜欢使用内置的异常类型而不是创建自己的异常类型.您应该只创建新的异常类型,当您希望捕获它并且行为方式与捕获内置类型时的行为完全不同时.在这种情况下,不应出现这种情况 - 您不希望发现这种情况,因为它表示使用相关类时出错.为此,不值得创建一个新类型只是为了让它有另一个名称 - 这就是你传递给ValueError()它的消息字符串.

是否有可能对您的班级进行重组,以便无法实现这种无效状态?

  • 在Python本身中可以找到一个在无效状态的调用中引发`ValueError`的好例子:http://hg.python.org/cpython/file/v3.3.1/Lib/subprocess.py#l881 (3认同)
  • 谢谢 - 我想重要的一点是,没有人愿意抓住异常(这将是一个["愚蠢的例外"](http://blogs.msdn.com/b/ericlippert/archive/2008/09/ 10/vexing-exceptions.aspx)在客户端) (2认同)

Her*_*mes 9

我发现RuntimeError最合适的所有内置异常来表示无效状态.

请参阅CPython中如何使用它的示例:

Python 2.7.10 (default, Jul 13 2015, 12:05:58)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from threading import Thread
>>> Thread().join()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 938, in join
    raise RuntimeError("cannot join thread before it is started")
RuntimeError: cannot join thread before it is started
Run Code Online (Sandbox Code Playgroud)

值得注意的是,即使CPython实现本身与库之间特定异常类型的使用也不一致.有时ValueError会使用,但在我看来,它从Python文档中的描述表明它的使用是为其他情况保留的.RuntimeError是一个更普遍的例外,当一段代码无法正确处理事件时,如果给出了正确的输入,则应该使用它,这有点类似于对象处于无效状态时的情况.