[英]How do I raise a custom exception from a package __init__?
我有一个包__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__
时执行的函数中包装版本检查吗? 我只是在寻找有关首选方法的建议。
谢谢
因为看起来你没有任何用户可以使用该异常 - 除非你的其他模块使用这个模块作为更大系统的一部分,我说你不需要这里的自定义异常。
除了给出的错误信息之外,从中获得的收益很少。 试图导入你的Ay模块必须要注意它,捕获异常,或者只是让程序停止回溯。 因为要知道它,它需要导入你的模块,它只会崩溃到一个回溯 - 然后用户可以读取错误消息。
对于一个读取错误消息的人来说,一个简单的“Exception”表明它是不正确的PythonVersin和任何自定义异常一样好。
在技术方面,Python需要在提升之前了解PythonVersionError
:在尝试在if
块中提升之前,需要先放置该代码。
最后,如果您正在构建一个更大的系统,并且系统的其他部分可能会尝试捕获PythonVersionError
,那么coorect事情就是将它放在自己的文件/模块中,以便它可用于此模块它,以及导入它的任何其他模块。
这里似乎有些尴尬。
当它不会在其他模块中的任何其他地方重用时,创建自定义Exception类真的很有用吗? 如果每个人都这样做,我们最终会得到每个模块定义它自己的不同(可能是不兼容的)PythonVersionError类。
为什么不使用标准的现有例外? 对于这个,我可能会选择标准的RuntimeError异常。
好的,我知道你不想要这个答案,但无论如何。
如果我真的想这样做,至少我会将PythonVersionException类定义为检查代码的本地实例,以避免污染模块命名空间或模块其他文件的任何全局命名空间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.