【问题标题】:Which exception should I throw if a module is not the correct version?如果模块不是正确的版本,我应该抛出哪个异常?
【发布时间】:2016-08-19 08:39:07
【问题描述】:

这可能以前有人问过,或者我可能过于迂腐,但我自己的搜索结果是空的。

查看Python 2.x exceptions page,如果我的脚本确定已导入模块的__version__,我不确定应该使用哪个raise,例如cv2,不是正确的版本。例如,我正在处理的脚本需要 OpenCV 版本 3;如果它确定版本!= 3,则以下块中 raise 的最佳例外是什么?

import cv2
if not cv2.__version__.startswith('3'):
    raise ValueError('OpenCV _3_ required')

【问题讨论】:

    标签: python exception version


    【解决方案1】:

    如果现有的异常不够用,您可以创建自己的自定义异常。

    class VersionError(Exception):
        def __init__(self, msg):
            Exception.__init__(self,msg) 
    

    【讨论】:

    • 啊,是的,我意识到我可以添加自己的,我只是对那些已经可用的内容感到好奇。但这也有效!
    • 这对我来说有点矫枉过正。此外,您可以通过not 提供__init__ 来简化此操作。 class VersionError(Exception): pass 可以正常工作(或者,如果你真的想加倍努力,你可以添加一个文档字符串而不是 pass
    • 是的,也可以。但由于 OP 已经传递了他们自己的自定义消息,我觉得我应该添加带有 msg 参数的 __init__ 调用。
    【解决方案2】:

    您有很多选项,具体取决于您要对此异常执行的操作...通常,我希望安装脚本能够处理设置适当版本的依赖项,因此我可能会将其视为简单的运行时断言——因此AssertionError 可能是合适的。

    这个真的很好——你不需要if声明,只需要assert

    assert cv2.__version__.startswith('3'), 'OpenCV _3_ required'
    

    我的下一个赌注是使用RuntimeError,因为这实际上是在运行时发生的一般异常(通常不意味着被捕获)......这是一个非常普遍的“哦,快点,什么糟糕的事情发生了,我们无法恢复。让我们吐出一个错误让用户知道发生了什么”。

    【讨论】:

    • 谢谢!这就是我要找的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2012-12-25
    相关资源
    最近更新 更多