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():

我正在开发一个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():
    ...
    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']
,后续导入只需在那里查找它<代码>无论如何都必须加载一个
,才能引发异常。不过,为异常类提供单独的模块确实使它们更容易找到。(见丹茹指南中的“组织”)