Python 中的异常与错误

pet*_*rov 10 python exception

我来自 Java,其中 Exceptions 和 Errors 是完全不同的东西,它们都源自于一个叫做Throwable. 在 Java 中,您通常不应该尝试捕获错误。

在 Python 中,虽然区别似乎很模糊。

到目前为止,在阅读了一些文档并检查了层次结构后,我有以下问题:

  1. 存在语法错误,这当然会导致您的程序根本无法启动。对?

  2. “在执行过程中检测到的错误称为异常,并不是无条件致命的”(根据教程)。这里的“致命”是什么意思?此外,一些像 AttributeError 这样的对象(根据上面的定义)实际上是异常,即使它们的名称中包含 Error,这个结论是否正确?

  3. 一些类派生自 Exception 但在其名称中包含 Error。这不是令人困惑吗?但即便如此,这也意味着名称中的 Error 并没有什么特别之处,它仍然是一个 Exception。或不... ?

  4. “所有内置的非系统退出异常都源自 [Exception]”(引自此处
    那么哪些是系统退出异常,哪些不是?目前还不清楚。所有用户定义的异常也应该从 Exception 派生。所以基本上作为初学者,除了 Exception 之外,我还需要担心其他任何事情吗?好像没有。

  5. 警告也源自异常。那么警告是致命的还是系统退出的,或者这些都不是?

  6. AssertionError 在哪里适合所有这些?它是致命的还是系统退出?

  7. 如何知道或指定某个 Exception 类表示致命的或系统退出的异常?

Sha*_*ger 10

  1. 是的。SyntaxError除非在动态执行的代码(通过eval/ exec)的情况下,否则无法捕获,因为它发生在代码实际运行之前。
  2. “致命”的意思是“不管代码怎么说,程序都会死”;Python 中的异常不会发生这种情况,它们都是可捕获的。os._exit可以强行杀死进程,但它是通过绕过异常机制来实现的。
  3. 异常和错误之间没有区别,因此术语无关紧要。
  4. 系统退出异常源自BaseException,但不是源自Exception。但是它们可以像任何其他异常一样被捕获
  5. 根据警告过滤器的不同,警告的行为有所不同,源自Exception意味着它们不在“系统退出”类别中
  6. AssertionError只是另一个Exception子类,所以它不是“系统退出”。它只是与assert具有特殊语义的语句相关联。
  7. 源自BaseException但不是Exception(例如SystemExitKeyboardInterrupt)的东西“不合理捕捉”(或者如果你确实捕捉到它们,它应该几乎总是记录/执行清理并重新抛出它们),其他一切(也源自Exception)是“有条件的合理捕捉”。没有其他区别。

需要说明的是,“系统退出”只是表示“except Exception:抓不到的东西”;如果不except涉及任何块,则所有异常(除了警告,如前所述,根据警告过滤器的不同行为)都是“系统退出”。