【发布时间】:2020-02-09 23:07:37
【问题描述】:
我有一个简单的插件系统,简化形式如下。想法是插件将实现一个抽象类,并可以引发异常以发出拆卸信号。
# my_plugin.py
import my_app
class MyPlugin(my_app.MyPluginBase):
def start(self):
raise my_app.MyLibException()
# my_app.py
import abc
import importlib
class MyLibException(Exception):
pass
class MyPluginBase(abc.ABC):
@abc.abstractmethod
def start(self):
pass
def main():
module = importlib.import_module('my_plugin')
klass = getattr(module, 'MyPlugin')
try:
app = klass()
app.start()
except MyLibException as e:
print('ok')
print(e.__class__)
except Exception as e:
print('not ok')
print(e.__class__)
if __name__ == '__main__':
main()
运行上述结果:
not ok
<class 'my_app.MyLibException'>
在这种情况下处理异常的正确方法是什么?我想在这里捕获引发的异常except MyLibException as e: 而不是except Exception as e:。
【问题讨论】:
-
我不确定这是否正确,但是如果在
my_app.py中定义MyLibException后添加from my_app import MyLibException,则会处理异常并打印“ok”。 -
这看起来像是一些反模式,在同一个文件中导入一个类,以前没见过。您可能见过类似的参考实现吗?谢谢
-
我同意它看起来像一个反模式,我还没有找到任何这样的参考实现。我认为处理它的最佳方法是完全避免循环依赖并在单独的文件中定义
MyLibException。 -
同意!将异常放在单独的模块/文件中将使其工作,不幸的是,这不是我的选择,因为这里的想法是让
my_app.py通过plugins扩展单个文件模块。但是请注意,如果my_app.py开始直接导入my_plugin.py,一切都会按预期工作,只是使用 importlib 时不会。 -
你确定直接导入
my_plugin可以吗?当我尝试时,我仍然遇到同样的问题。如果您真的坚持将所有内容保存在一个文件中,希望我的回答能提供足够的信息。但是,如果您担心反模式,您应该注意循环导入也不是一个好习惯。
标签: python python-3.x plugins python-import python-importlib