继承 BaseException 与 Exception

Gil*_*esz 9 python-3.x

Exception我知道和BaseException之间有什么区别Python。我想知道什么是更好的做法并且更具Python风格:我的异常应该继承自BaseExceptionorException吗?

Mis*_*agi 11

默认情况下,所有用户定义的异常都应继承自Exception. 文档中建议这样做:

例外Exception

所有内置的、非系统退出的异常都派生自此类。所有用户定义的异常也应该从此类派生。

这也是PEP 8 推荐和推动的

Exception从而不是派生异常BaseException。直接继承 fromBaseException是为异常保留的,在这些异常中捕获它们几乎总是错误的做法。


一般来说,派生的异常Exception旨在由常规代码处理。相反,直接源自的例外则BaseException与特殊情况相关;像正常异常一样处理它们可能会导致意外的行为。这就是为什么惯用的“catch all”处理程序只处理Exception

def retry(func):
    while True:
        try:
            return func()
        except Exception as err:
            print(f"retrying after {type(err)}: {err}")
Run Code Online (Sandbox Code Playgroud)

BaseException直接从current继承的内置异常有KeyboardInterrupt、 、SystemExit和 ,GeneratorExit它们与程序、线程或生成器/协程的关闭相关。不正确地处理它们将阻止正常关闭。

请注意,虽然默认应该是继承自,但如果有充分的理由,Exception也可以继承自。BaseException例如,asyncio.CancelledError也继承自Task.Task,BaseException因为它代表 的线程等效项的关闭。asyncio