Python中的异常与错误

问题描述 投票:-1回答:1

我来自Java,其中异常和错误是完全不同的东西,它们都源自Throwable。在Java中,通常不要尝试捕获错误。

虽然在Python中似乎区别是模糊的。

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

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

  2. “在执行过程中检测到的错误称为exceptions,它们并非无条件致命”(根据the tutorial)。 “致命”在这里是什么意思?而且,某些属性(如AttributeError)(通过上述定义)实际上是异常,即使它们的名称中包含Error,该结论正确吗?

  3. 某些类从Exception派生,但名称中包含Error。这不是很混乱吗?但是即使如此,这意味着名称中的Error绝非特别,它仍然是Exception。或不... ?

  4. “所有内置的,非系统退出的异常均源自[Exception]”(引自here)那么哪些是system-exiting异常,哪些不是?目前尚不清楚。所有用户定义的异常也应从Exception派生。因此,基本上,作为一个初学者,我需要担心除Exception之外的其他问题吗?好像没有。

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

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

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

python exception
1个回答
2
投票
  1. 是。除非在动态执行代码的情况下(通过SyntaxError / eval),否则exec是不可捕获的,因为它发生在代码实际运行之前。
  2. “ Fatal”的意思是“不管代码说什么,程序都会死掉”; Python中的异常不会发生,它们都是可捕获的。 os._exit可以强制杀死进程,但是可以通过绕过异常机制来杀死它。
  3. 异常与错误之间没有区别,因此命名没有关系。
  4. 系统退出异常源自BaseException,但不是源自Exception。但是它们可以像其他任何异常一样被捕获
  5. 警告的行为基于警告过滤器,并且从Exception派生表示它们不在“系统退出”类别中
  6. AssertionError只是另一个Exception子类,因此它不是“系统退出”。它仅与assert语句绑定,该语句具有特殊的语义。
  7. BaseException而非Exception衍生的东西(例如SystemExitKeyboardInterrupt)是“不合理的捕获”(或者,如果您捕获了它们,则几乎总是应该记录/执行清理并重新抛出)他们),其他所有内容(也来自Exception)都是“有条件地合理捕获”。没有其他区别。

要清楚,“系统退出”只是一种说法,“ except Exception:不会捕捉到的东西”;如果不涉及except块,则所有异常(除了警告,如所指出的,基于警告过滤器的行为也不同)是“系统退出”。

© www.soinside.com 2019 - 2024. All rights reserved.