python - Python 中的异常与错误

标签 python exception

我来自 Java,其中 Exceptions 和 Errors 是完全不同的东西,它们都源自称为 Throwable 的东西。
在 Java 中,您通常不应该 try catch 错误。

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

到目前为止,在阅读了一些文档并检查了 the hierarchy 之后,我有以下问题:

  • 存在语法错误,这当然会导致您的程序根本无法启动。对?
  • “在执行过程中检测到的错误称为异常并且不是无条件致命的”(根据 the tutorial )。这里的“致命”是什么意思?此外,一些像 AttributeError 这样的对象(根据上面的定义)实际上是异常,即使它们的名称中包含 Error,这个结论是否正确?
  • 某些类从 Exception 派生,但在其名称中包含 Error。这不是令人困惑吗?但即便如此,这也意味着名称中的 Error 并没有什么特别之处,它仍然是一个 Exception。或不... ?
  • “所有内置的、非系统退出的异常都源自 [Exception]”(引自 here)
    那么哪些是 系统退出 异常,哪些不是?目前还不清楚。所有用户定义的异常也应该从 Exception 派生。所以基本上作为初学者,除了 Exception 之外,我还需要担心其他任何事情吗?好像没有。
  • 警告也源自异常。那么警告是致命的还是系统退出的,或者这些都不是?
  • AssertionError 在哪里适合所有这些?它是致命的还是系统退出?
  • 如何知道或指定某个 Exception 类代表致命或系统退出异常?
  • 最佳答案

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

  • 需要明确的是,“退出系统”只是表示“Exception 不会捕捉到的东西”的一种方式;如果不涉及 except Exception: 块,则所有异常(除了警告,如上所述,根据警告过滤器的行为不同)都是“系统退出”。

    关于python - Python 中的异常与错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60708789/

    相关文章:

    python - 提高 "increment the number represented as an array of digits"的时间复杂度

    java - 禁用log4j 2异常(apache异常)

    objective-c - 在 Objective-C 中使用异常的代价是什么?

    c++ - 基于 STL::vector of structs 的模板类映射 - 查找无效键(STL::string)并抛出异常

    python - 如何在 Twisted/Python 中使用 AMP 创建双向消息传递

    python - 回溯显示直到装饰器

    python - 从 numpy 数组创建图形顶点

    python - 向 Pandas DataFrame 箱线图添加图例

    java - 任务恢复InterruptionException但无法在Thread中捕获

    python - Maya - 在未捕获的异常上自动运行函数