如何使应用程序与使用过的库依赖关系所引发的异常脱钩?
[app] --uses--> [lib] --dependson--> [dependency]
/ /
x-
\ /
`-----needstohandle,soimports-----> --'
问题出在真正的pip代码上:
如何在模块B中封装异常?要从模块A删除对C的依赖?如何确保原始异常的原因和细节不丢失?换句话说,我该如何使用其他名称重新引发异常?
下面的代码片段完成了所需的操作,但仅适用于Python 3:
try:
dependency_call()
except DependencyError as exc:
raise LibraryError from exc
更新:我正在寻找Python 2兼容的解决方案,Python 3增加了…从…起到了很好的效果.
更新2:封装异常的目的是在[lib]中捕获异常,然后重新抛出一个新异常,以[app]保留堆栈跟踪,以便调试工具仍可以遍历代码(对于人为解决方案the answer by Alex Thornton应该是好).
解决方法:
您可以通过引用Exception基类来捕获任意异常:
except Exception as exc:
raise ApplicationError from exc
为了使成语在Python 2中正常工作,您必须使用自定义异常来解决:
class ApplicationError(Exception):
def __init__(self, cause, trace):
self.cause = cause
self.trace = trace
def __str__(self):
return '{origin}\nFrom {parent}'.format(origin=self.trace,
parent=self.cause)
然后像这样提高它:
except Exception, exc:
raise ApplicationError(exc)
它会在引发原因时打印出原因,如果您决定也捕获ApplicationError,那么它也是可以访问的属性.
标签:python-2-7,exception,python,pip
来源: https://codeday.me/bug/20191121/2049149.html