为什么当下一行出现错误(除了语法错误)时,Python 能够运行前面的代码? [重复]

问题描述 投票:0回答:2

假设我在 python 3 中有以下代码:

print("Hello, world!")

这肯定会毫无问题地运行,输出为

>Hello, world!

如果我按如下方式更改代码:

print("Hello, world!")
thisIsMyError

程序将打印以下内容:

>Hello, world!
>Traceback (most recent call last):
  File "main.py", line 2, in <module>
    thisIsMyError
NameError: name 'thisIsMyError' is not defined

意味着第一行代码被执行,然后第二行在尝试执行时无法识别。

但是,如果我的代码是这样的:

print("Hello, world!")
print("What a great day!"
thisIsMyError

输出是这样的:

>File "main.py", line 3
    thisIsMyError
                ^
SyntaxError: invalid syntax

意味着即使第一行仍然有效,但它根本没有运行。

我的问题是:这些错误之间 python 的编译方式有什么区别,其中一个错误至少能够成功执行第一行代码(Hello,world!),即使后续行中有错误,但是在第二个错误中,由于后续错误,它不会执行第一行代码?

python
2个回答
4
投票

您看到两个异常的不同输出的原因是因为一个是运行时异常,另一个是解析异常

在 Python 运行您的脚本之前,它必须解析您的代码并将其转换为 Python 字节码。 Python 通过验证代码是否具有有效的语法来解析您的代码。如果 Python 发现您的脚本包含无效语法,它会引发

SyntaxError
并停止。这里要注意的重要一点是没有运行任何代码。正如我所说,Python 对脚本的解析发生在它尝试运行脚本之前。这就是为什么在第二个示例中,第一行未运行。 Python 仍处于解析脚本的阶段。 但是,在您的第一个示例中,Python 已经解析了您的代码并验证了它具有有效的语法。现在 Python 尝试执行您的代码。 Python 解释器将继续运行,直到遇到错误,然后停止。这里需要注意的重要一点是,当 Python 引发

NameError

时,它就处于执行阶段。正如我上面所说,Python 会尽可能执行脚本中的代码。这就是为什么在第一个示例中,运行第一个语句,然后 Python 解释器停止。 基本上,

SyntaxError

NameError

是两种不同的异常类型。

SyntaxError
在Python的解析阶段引发,而
NameError
在Python的执行(也称为运行时)阶段引发。异常产生的输出是不同的,因为异常是在不同的阶段和出于不同的目的引发的。
    
您从第二个示例中得到 

SyntaxError

0
投票

print("Hello, world!") print("What a great day!" thisIsMyError


因为第二行的

print
 函数调用没有 
右括号

如果添加括号,您将得到

NameError

正如其他人指出的那样,您在解析时会得到

SyntaxError
,因为 Python 无法解析无效代码。

NameError

在运行时出现,代码已被解析,但包含未定义的变量名称。

    

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