哪种标准异常类用于协议违规?

时间:2016-02-24 10:26:43

标签: python exception protocols

根据给定的协议(我无法更改,只实现),某些函数initialize_foo()应该只被调用一次:

 def initialize_foo():
     """
     ...
     Note:
          You must call this function exactly once.
     """

我想识别一个被调用两次的协议滥用,并引发异常:

 _foo_initialized = False

 def initialize_foo():
     """
     ...
     Note:
          You must call this function exactly once.
     """
     if _foo_initialized:
         raise <what>?

     ...
     _foo_initialized = True

问题是班级要提出的问题。看standard exceptions,除了Exception之外,我找不到任何子类,这似乎太笼统了。

这种情况下的一般做法是什么?

2 个答案:

答案 0 :(得分:2)

我使用RuntimeError

它通常用于那种东西,即使在标准库中也是如此。您可以在warnings module中找到与您的用例非常相似的示例:

if self._entered:
    raise RuntimeError("Cannot enter %r twice" % self)

另一个例子是threading

if self._started.is_set():
    raise RuntimeError("threads can only be started once")

您还可以考虑提出一个特殊的异常(可能是RuntimeError的子类),如果该错误应该被捕获,并且您认为RuntimeError可能不明确。

答案 1 :(得分:1)

我建议你继承 warning ,而不是有例外,因为我觉得很多时候你宁愿继续运行。< / p>