这两者之间有什么区别:
except:
# do something
和
except BaseException as be:
print(be)
我的意思是在第一种情况下捕获了所有可能的异常,但第二种情况是否正确?
也可以使用第一种情况打印错误消息吗?
答案 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
,除了上述所有异常之外,您还捕获了SystemExit
,KeyboardInterrupt
和GeneratorExit
类型的异常。
例如,通过捕获KeyboardInterrupt
,您可以在用户发起退出后停止退出代码(例如在控制台中按^C
,或者停止启动在某些口译员上的应用)。这可能是想要的行为(例如-记录退出),但是应格外小心!
在上面的示例中,通过捕获BaseException
,可以在您希望退出的应用程序挂起。