【发布时间】:2017-11-23 03:54:23
【问题描述】:
这两者有什么区别:
except:
# do something
和
except BaseException as be:
print(be)
我的意思是在第一种情况下,所有可能的异常都被捕获,但第二种情况是这样吗?
也可以使用第一种情况打印错误信息吗?
【问题讨论】:
这两者有什么区别:
except:
# do something
和
except BaseException as be:
print(be)
我的意思是在第一种情况下,所有可能的异常都被捕获,但第二种情况是这样吗?
也可以使用第一种情况打印错误信息吗?
【问题讨论】:
实际上,对于任何当前的 Python 版本,except: 和 except BaseException: 之间没有区别。
那是因为您不能只将任何类型的对象作为异常引发。 raise statement 明确禁止引发其他任何事情:
[...] raise 将第一个表达式计算为异常对象。 它必须是
BaseException的子类或实例。
我的大胆强调。然而,情况并非总是如此,在较旧的 Python 版本(2.4 及之前)中,您也可以使用 strings 作为例外。
这样做的好处是您可以轻松访问捕获的异常。 为了能够添加as targetname,您必须捕获特定类别的异常,并且只有BaseException 会这样做。
您仍然可以使用sys.exc_info() 访问当前活动的异常:
except:
be = sys.exc_info()[1]
选择你认为对你未来的自己和你的同事更易读的东西。
【讨论】:
BaseException = ValueError 这样的东西 ;-) except: 保证总是除了任何错误。
builtins.BaseException 是一个不错的后备方案,但也不是万无一失的。
except Exception 与 except BaseException 有何不同?
Exception 是BaseException 的子类,但它不是唯一的此类子类。还有其他子类,请参阅inheritance diagram in the docs;这些其他异常并不是真正的错误,而是表明您通常不会捕获的信号。
接受的答案是不正确不完整(至少对于 Python 3.6 及更高版本)。
通过捕获Exception,您可以捕获大多数错误 - 基本上是您使用的任何模块可能抛出的所有错误。
通过捕获BaseException,除了上述所有异常之外,您还可以捕获SystemExit、KeyboardInterrupt 和GeneratorExit 类型的异常。
例如,通过捕获KeyboardInterrupt,您可以在用户发起退出后阻止您的代码退出(例如在控制台中按^C,或在某些解释器上停止启动的应用程序)。这可能是一种需要的行为(例如 - 记录退出),但应格外小心!
在上面的示例中,通过捕获BaseException,您可能会导致应用程序在您希望退出时挂起。
【讨论】: