繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM