我有一个包__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__
时执行的函数中包装版本检查吗?我只是在寻找有关首选方法的建议。
由于
答案 0 :(得分:3)
因为看起来你不会有任何用户参与该例外 - 除非您作为更大系统的一部分实现的其他模块使用此模块,否则我说您不需要自定义异常。
除了给出的错误信息外,从中获得的收益很少。试图导入你的Ay模块必须要注意它,捕获异常,或者只是让程序停止回溯。因为要知道它,它需要导入你的模块,它只会崩溃到一个回溯 - 然后用户可以读取错误消息。
对于一个阅读错误消息的人来说,一个简单的“异常”声明它是不正确的PythonVersin和任何自定义异常一样好。
在技术方面,Python需要在提升之前了解PythonVersionError
:在尝试在if
块中提升代码之前,需要先放置代码。
最后,如果你 构建一个更大的系统,并且系统的其他部分可能试图捕获PythonVersionError
,那么coorectct要做的就是把它放在自己的文件中/ module,以便该模块可以使用它,以及导入它的任何其他模块。
答案 1 :(得分:2)
这里似乎有些尴尬。
在不在其他模块中的其他地方重用时,创建自定义Exception类真的很有用吗?如果每个人都这样做,我们最终会得到每个模块定义它自己的不同(可能是不兼容的)PythonVersionError类。
为什么不使用标准的现有例外?对于这个,我可能会选择标准的RuntimeError异常。
好的,我知道你不想要这个答案,但无论如何。
如果我真的想这样做,至少我会将PythonVersionException类定义为检查代码的本地实例,以避免污染模块名称空间或模块其他文件的任何全局名称空间。