如何从包__init__中引发自定义异常?

时间:2011-03-08 15:06:02

标签: python

我有一个包__init__.py,看起来像这样:

import sys

__required_python_version = (2,6, 0)

if sys.version_info < __required_python_version:
    this_version = '.'.join([str(x) for x in sys.version_info[0:3]])
    required_version = '.'.join([str(x) for x in __required_python_version])
    raise PythonVersionError(this_version, required_version)

class PythonVersionError(Exception):
    def __init__(self, this_version, required_version):
        self.this_version = this_version
        self.required_version = required_version

    def __str__(self):
        return 'Python version %s is invalid.  Must be at least %s' % (self.this_ver, self.required_ver)

虽然我确信有一种更优雅的方式来格式化这些版本字符串,但我可以通过使用标准异常来获得,我真正的问题是我将如何做这样的事情?最好的方法是将我的自定义异常移动到单独的文件中并导入它吗?或者我应该在运行__init__时执行的函数中包装版本检查吗?我只是在寻找有关首选方法的建议。

由于

2 个答案:

答案 0 :(得分:3)

因为看起来你不会有任何用户参与该例外 - 除非您作为更大系统的一部分实现的其他模块使用此模块,否则我说您不需要自定义异常。

除了给出的错误信息外,从中获得的收益很少。试图导入你的Ay模块必须要注意它,捕获异常,或者只是让程序停止回溯。因为要知道它,它需要导入你的模块,它只会崩溃到一个回溯 - 然后用户可以读取错误消息。

对于一个阅读错误消息的人来说,一个简单的“异常”声明它是不正确的PythonVersin和任何自定义异常一样好。

在技术方面,Python需要在提升之前了解PythonVersionError:在尝试在if块中提升代码之前,需要先放置代码。

最后,如果你 构建一个更大的系统,并且系统的其他部分可能试图捕获PythonVersionError,那么coorectct要做的就是把它放在自己的文件中/ module,以便该模块可以使用它,以及导入它的任何其他模块。

答案 1 :(得分:2)

这里似乎有些尴尬。

在不在其他模块中的其他地方重用时,创建自定义Exception类真的很有用吗?如果每个人都这样做,我们最终会得到每个模块定义它自己的不同(可能是不兼容的)PythonVersionError类。

为什么不使用标准的现有例外?对于这个,我可能会选择标准的RuntimeError异常。

好的,我知道你不想要这个答案,但无论如何。

如果我真的想这样做,至少我会将PythonVersionException类定义为检查代码的本地实例,以避免污染模块名称空间或模块其他文件的任何全局名称空间。