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,至少在我看来,这表明这是一个运行时错误。
如果我理解正确,当我运行一个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,至少在我看来,这表明这是一个运行时错误。