我来自Java,其中异常和错误是完全不同的东西,它们都源自Throwable
。在Java中,通常不要尝试捕获错误。
虽然在Python中似乎区别是模糊的。
到目前为止,在阅读了一些文档并检查了the hierarchy之后,我有以下问题:
存在语法错误,这些错误当然会导致您的程序完全无法启动。对?
“在执行过程中检测到的错误称为exceptions,它们并非无条件致命”(根据the tutorial)。 “致命”在这里是什么意思?而且,某些属性(如AttributeError)(通过上述定义)实际上是异常,即使它们的名称中包含Error,该结论正确吗?
某些类从Exception派生,但名称中包含Error。这不是很混乱吗?但是即使如此,这意味着名称中的Error绝非特别,它仍然是Exception。或不... ?
“所有内置的,非系统退出的异常均源自[Exception]”(引自here)那么哪些是system-exiting异常,哪些不是?目前尚不清楚。所有用户定义的异常也应从Exception派生。因此,基本上,作为一个初学者,我需要担心除Exception之外的其他问题吗?好像没有。
警告也源自Exception。那么警告是致命的还是系统退出的?或者这些都不是?
AssertionError在哪里适合所有这些?是致命的还是系统退出?
人们如何知道或指定某个Exception类代表致命或系统退出的异常?
SyntaxError
/ eval
),否则exec
是不可捕获的,因为它发生在代码实际运行之前。os._exit
可以强制杀死进程,但是可以通过绕过异常机制来杀死它。BaseException
,但不是源自Exception
。但是它们可以像其他任何异常一样被捕获Exception
派生表示它们不在“系统退出”类别中AssertionError
只是另一个Exception
子类,因此它不是“系统退出”。它仅与assert
语句绑定,该语句具有特殊的语义。BaseException
而非Exception
衍生的东西(例如SystemExit
,KeyboardInterrupt
)是“不合理的捕获”(或者,如果您捕获了它们,则几乎总是应该记录/执行清理并重新抛出)他们),其他所有内容(也来自Exception
)都是“有条件地合理捕获”。没有其他区别。要清楚,“系统退出”只是一种说法,“ except Exception:
不会捕捉到的东西”;如果不涉及except
块,则所有异常(除了警告,如所指出的,基于警告过滤器的行为也不同)是“系统退出”。