Python 3.x 从BaseException继承vs异常

Python 3.x 从BaseException继承vs异常,python-3.x,Python 3.x,我知道Python中的Exception和BaseException之间有什么区别。我想知道什么是一个好的实践和更具python的: 如果我的异常继承自BaseException或Exception?默认情况下,所有用户定义的异常都应继承自Exception。这是: 异常异常 所有内置的、非系统退出的异常都派生自此类所有用户定义的异常也应从此类派生。 这也是: 从Exception而不是BaseException派生异常。从BaseException直接继承是为异常保留的,因为捕获它们几乎总是错

我知道
Python
中的
Exception
BaseException
之间有什么区别。我想知道什么是一个好的实践和更具python的:
如果我的异常继承自
BaseException
Exception

默认情况下,所有用户定义的异常都应继承自
Exception
。这是:

异常
异常

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

这也是:

Exception
而不是
BaseException
派生异常。从
BaseException
直接继承是为异常保留的,因为捕获它们几乎总是错误的


通常,从
Exception
派生的异常将由常规代码处理。相反,直接从
BaseException
派生的异常与特殊情况相关;像处理正常异常一样处理它们可能会导致意外行为。这就是惯用的“一网打尽”处理程序仅处理异常的原因:

def retry(func):
    while True:
        try:
            return func()
        except Exception as err:
            print(f"retrying after {type(err)}: {err}")
当前直接从
BaseException
继承的内置异常有
键盘中断
系统退出
生成退出
,它们与关闭程序、线程或生成器/协同程序相关。不正确地处理它们将阻止正常关机

请注意,虽然默认值应该是从
Exception
继承,但如果有充分的理由,可以从
BaseException
继承。例如,还继承自
BaseException
,因为它表示关闭
asyncio
的线程等价物任务