繁体   English   中英

除了 BaseException 和except BaseException 有什么区别

[英]What is the difference between except and except BaseException

这两者有什么区别:

except:
    # do something

except BaseException as be:
    print(be)

我的意思是在第一种情况下所有可能的异常都被捕获,但第二种情况是否如此?

也可以使用第一种情况打印错误消息吗?

实际上,对于任何当前的 Python 版本, except:except BaseException:之间没有区别

那是因为您不能将任何类型的对象作为异常引发。 raise语句明确禁止引发其他任何事情:

[...] raise 将第一个表达式计算为异常对象。 它必须是BaseException的子类或实例。

大胆强调我的。 然而,情况并非总是如此,在较旧的 Python 版本(2.4 及更早版本)中,您也可以使用字符串作为异常。

这样做的好处是您可以轻松访问捕获的异常。 为了能够添加as targetname ,您必须捕获特定类别的异常,并且只有BaseException会这样做。

您仍然可以使用sys.exc_info()访问当前活动的异常:

except:
    be = sys.exc_info()[1] 

选择你觉得对你未来的自己和你的同事更易读的东西。

接受的答案完整(至少对于 Python 3.6 及更高版本)。

通过捕获Exception您可以捕获大多数错误——基本上是您使用的任何模块可能抛出的所有错误。

通过捕获BaseException ,除了上述所有异常之外,您还可以捕获SystemExitKeyboardInterruptGeneratorExit类型的异常。

例如,通过捕获KeyboardInterrupt ,您可以在用户发起退出后阻止代码退出(例如在控制台中按^C或在某些解释器上停止启动的应用程序)。 这可能是一种想要的行为(例如 - 记录退出),但应格外小心使用!

在上面的示例中,通过捕获BaseException ,您可能会导致应用程序在您希望退出时挂起。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM