在Python类中,当在运行该方法之前必须更改类的某些其他属性时,我应该从实例方法中引出什么类型的错误?
我来自我将使用的C#背景InvalidOperationException,"当方法调用对于对象的当前状态无效时引发的异常",但我在Python中找不到等效的内置异常.
ValueError当问题出在函数参数时,我一直在提高("当内置操作或函数接收到具有正确类型但不适当值的参数时引发").我认为这在技术上是self参数的无效值; 这是治疗它的正确方法吗?例如,这是惯用的:raise ValueError("self.foo must be set before running self.bar()")?
Dae*_*yth 27
ValueError在这种情况下提出是最好的事情.对于python,您应该更喜欢使用内置的异常类型而不是创建自己的异常类型.您应该只创建新的异常类型,当您希望捕获它并且行为方式与捕获内置类型时的行为完全不同时.在这种情况下,不应出现这种情况 - 您不希望发现这种情况,因为它表示使用相关类时出错.为此,不值得创建一个新类型只是为了让它有另一个名称 - 这就是你传递给ValueError()它的消息字符串.
是否有可能对您的班级进行重组,以便无法实现这种无效状态?
我发现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是一个更普遍的例外,当一段代码无法正确处理事件时,如果给出了正确的输入,则应该使用它,这有点类似于对象处于无效状态时的情况.