除了BaseException之外有什么区别

时间:2017-06-20 14:28:42

标签: python exception-handling

这两者之间有什么区别:

except:
    # do something

except BaseException as be:
    print(be)

我的意思是在第一种情况下捕获了所有可能的异常,但第二种情况是否正确?

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

2 个答案:

答案 0 :(得分:15)

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

那是因为你不能把任何类型的对象作为例外。 raise statement明确禁止提出任何其他内容:

  

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

大胆强调我的。但情况并非总是如此,在较旧的Python版本(2.4及更早版本)中,您也可以使用 strings 作为例外。

然后,优点是您可以轻松访问捕获的异常。 为了能够添加as targetname ,您必须捕获特定类别的异常,并且只有BaseException才会这样做。< / p>

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

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

选择您认为对您未来的自我和同事更具可读性的内容。

答案 1 :(得分:4)

接受的答案不正确(至少对于Python 3.6及更高版本)。

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

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

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

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