如何將應用程序與使用庫依賴關係中出現的異常分離開來?在Python中封裝異常
[app] --uses--> [lib] --dependson--> [dependency]
//
x- <-propagates--o <---throwsexception--'/
\ /
`-----needstohandle,soimports-----> --'
的問題是從真實pip
代碼:
- 模塊A(REQ/req_set.py)depends on module B
- 模塊B(下載)uses module C(請求)
- 模塊A imports模塊C to handle exception from C
如何使用en在模塊B中封裝異常?從模塊A中刪除對C的依賴?如何確保原始異常的原因和細節不會丟失?換句話說,我怎樣才能用另一個名字來重新渲染異常呢?
下面的代碼片段確實是需要的,但它的Python 3只:
try:
dependency_call()
except DependencyError as exc:
raise LibraryError from exc
更新:我正在尋找的Python 2兼容的解決方案,在Python 3中添加raise ... from ...
,做的伎倆幾乎良好。
更新2:封裝例外的目標是趕上它[lib]
和再拋出一個新的一個[app]
保存堆棧跟蹤,使調試工具仍然可以步行的代碼(只有人類才能解決the answer by Alex Thornton應該是好的)。
@techtonik'from'是好的,你只需要定義你自己的'ApplicationError'異常。 – 2014-11-02 12:01:42
看起來是Python 3的東西。對於Python 2,它給出了SyntaxError - https://dpaste.de/SbtT – 2014-11-02 12:11:36
@techtonik:Thornton先生展示他的解決方案的方式看起來像是「全部抓住」,但我確信他只是想提供解決方案並儘可能快地相信,如果不是特定的例外情況,你可以通過重新提起例外來解決「全部」問題。 – 2014-11-02 12:23:48