Python 捕捉定制的好方法';间接';例外情况
我正在开发一个python应用程序,有一个特定的场景使我对处理在不同模块中定义的自定义异常感到困惑。考虑以下情况: 有Python 捕捉定制的好方法';间接';例外情况,python,exception,module,Python,Exception,Module,我正在开发一个python应用程序,有一个特定的场景使我对处理在不同模块中定义的自定义异常感到困惑。考虑以下情况: 有A.py、B.py和C.py模块。A.py定义了一个自定义异常,并在出现错误时引发该异常B.py导入A.py并运行其危险功能。稍后,C.py将导入B.py并执行其方法。代表如下: A.py->做一些简单的事情,但它很容易引发自定义异常 class CustomException(Exception): pass def dangerous_function():
A.py
、B.py
和C.py
模块。A.py
定义了一个自定义异常,并在出现错误时引发该异常B.py
导入A.py
并运行其危险功能。稍后,C.py
将导入B.py
并执行其方法。代表如下:
A.py->做一些简单的事情,但它很容易引发自定义异常
class CustomException(Exception):
pass
def dangerous_function():
...
raise CustomException('Exception occurred')
B.py->有许多方法使用模块A
中的危险函数
import A
class ModuleB:
def __init__(self):
pass
def run_stuff(self):
...
A.dangerous_function() # throws CustomException
def run_more_stuff(self):
...
A.dangerous_function() # throws CustomException
...
...
C.py->实例化模块B
,并运行其方法
from A import CustomException # <--
from B import ModuleB
def do_stuff():
m = ModuleB()
try:
m.run_stuff()
except CustomException as e:
print(f'Custom error occurred: {e}')
导入自定义异常的
不需要了解A
B
可以从导入CustomException
执行,然后该类将作为B.CustomException
提供。然后C
可以从B
导入它:
从B导入模块B,自定义异常
但是,如果您根本不希望C
依赖于自定义异常类,则可以让B
捕获异常并引发由B
定义的异常。(您可以使用raisefrom
使原始异常也可用于调试输出。)
有关这方面的更多信息,请参阅包装部分。我想说的唯一问题是,如果执行a.py
的全部内容会非常昂贵,在这种情况下,您可能希望将异常分解为一个单独的模块。只有第一次导入将执行a.py
:之后,该模块被缓存为sys.modules['a']
,后续导入只需在那里查找它<代码>无论如何都必须加载一个
,才能引发异常。不过,为异常类提供单独的模块确实使它们更容易找到。(见丹茹指南中的“组织”)