除了BaseException之外有什么区别

ste*_*stt 10 python exception-handling

这两者有什么区别:

except:
    # do something
Run Code Online (Sandbox Code Playgroud)

except BaseException as be:
    print(be)
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ers 17

实事求是地讲,有没有什么区别之间except:except BaseException:,任何当前的Python版本.

那是因为你不能只是将任何类型的对象引发为异常.该raise声明明确禁止提出任何其他内容:

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

大胆强调我的.但情况并非总是如此,在较旧的Python版本(2.4及之前版本)中,您也可以使用字符串作为例外.

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

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

except:
    be = sys.ext_info()[1] 
Run Code Online (Sandbox Code Playgroud)

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

  • 除非你之前没有输入类似`BaseException = ValueError`的东西;-)`除了:`保证总是除了任何错误. (2认同)
  • @a_guest:是的,*名字*仍然可以反弹.`builtins.BaseException`是一个不错的后备,但也不是万无一失的. (2认同)
  • @MaggieYing:`Exception`是`BaseException`的子类,但它不是唯一的这样的子类.还有其他子类,请参阅[docs中的继承图](https://docs.python.org/3/library/exceptions.html#exception-hierarchy); 那些其他例外不是真正的错误,而是你*通常*不会捕获的信号. (2认同)

EZL*_*ner 14

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

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

通过捕捉BaseException,除了上述所有的异常,还搭上类型的例外SystemExitKeyboardInterrupt以及GeneratorExit

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

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

  • 接受的答案是完全*正确*的。然而,如果没有这个答案中指出的警告,它是“不完整的”,所以感谢您指出这一点。 (2认同)