[英]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
,除了上述所有异常之外,您还可以捕获SystemExit
、 KeyboardInterrupt
和GeneratorExit
类型的异常。
例如,通过捕获KeyboardInterrupt
,您可以在用户发起退出后阻止代码退出(例如在控制台中按^C
或在某些解释器上停止启动的应用程序)。 这可能是一种想要的行为(例如 - 记录退出),但应格外小心使用!
在上面的示例中,通过捕获BaseException
,您可能会导致应用程序在您希望退出时挂起。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.