python - 哪个标准异常类用于违反协议(protocol)?

标签 python exception protocols

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

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

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

 _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 之外,我找不到任何子类,这似乎太笼统了。

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

最佳答案

我会使用 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 可能是模棱两可。

关于python - 哪个标准异常类用于违反协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35599453/

相关文章:

java - 对象输入流错误 : StreamCorruptedException

c# - 如何在多线程中从TargetInitationException中优雅地恢复?

ios - 为 indexPath 获取 didSelectItemAt 上的值并将其添加到委托(delegate)/协议(protocol)以填充标题单元格

python - 我应该如何在 python 模块中执行导入而不污染其命名空间?

社交网络的 Java 框架

Python 通信 vs shell=True

c++ - Catch(...) with unknown object - 我如何识别抛出的是什么?

swift - 如何在 Swift 中创建一个返回符合协议(protocol)的类型的函数?

arrays - 如何将返回符合 Equatable 的值的闭包传递给函数

python - 尝试匹配多个参数化测试时,pytest -k 表达式失败