Python 异常(SyntaxError 除外)是运行时错误吗?

Are Python Exceptions (apart from SyntaxError) runtime errors?

如果我理解正确,当我运行一个Python程序时,Python解释器生成字节码.pyc 文件出现在 .py 来源旁边),除非来源包含语法错误。

字节码编译器是否生成任何其他异常,或者所有其他异常是否在 运行 执行 .pyc 代码时引发?

好吧,任何异常类型都可以 技术上 在运行时通过 raise <exception> 引发。但我假设您了解这一点,并询问在 Python 解释您的代码(执行前)时可能会引发哪些异常。其实有不少:

  • SyntaxError:这是解析器在读取代码时引发的。它是由无效语法引起的,例如不平衡的括号,在错误的地方使用关键字等

  • IndentationError:这是 SyntaxError 的子类,只要您的代码缩进不当就会引发。一个例子是:

    if condition:
        line_indented_4_spaces
       line_indented_3_spaces
    
  • TabError:这是 IndentationError 的子类,当您在源文件中不一致地混合制表符和空格时引发。

  • SystemError:当内部操作失败时由解释器引发。遇到一个通常意味着您的 Python 安装有问题,可能需要重新安装。

  • MemoryError:类似于SystemError,当内存不足导致内部操作失败时可以引发。

所有这些异常都可以在您的代码开始执行之前引发。前三个是由损坏的源文件引起的,可以通过简单地修复语法或缩进来解决。然而,后两个是由解释器本身引发的,用于失败的内部操作。这意味着它们很少见,但也意味着它们更严重并且不容易修复。

当您使用 Python 代码时,通常没有编译步骤,所以我认为 Python 中的所有错误,包括语法错误,都是运行时错误。

例如,让我们写这个文件:

in xrange(5):

这显然是胡说八道(我们甚至将其命名为 nonsense.py),但让我们启动解释器:

$ python
>>> try:
...     import nonsense
... except SyntaxError:
...     print("A syntax error occurred at runtime!")
...
A syntax error occurred at runtime!
>>>

你知道了 - 在运行时引发并捕获了 SyntaxError,至少在我看来,这表明这是一个运行时错误。