了解Python语法错误

时间:2019-03-15 05:40:40

标签: python

假设我在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编译方式有什么区别,即使在后续错误中,它至少能够成功执行第一行代码(您好,世界!)行,但是在第二个错误中,由于后续错误,它不会执行第一行代码吗?

2 个答案:

答案 0 :(得分:3)

您看到两个例外的输出不同的原因是,一个是 运行时例外 ,而另一个是

在Python可以运行您的脚本之前,它必须解析您的代码并将其转换为Python字节码。 Python会通过验证语法是否有效来解析您的代码。如果Python发现您的脚本包含无效语法,它将引发SyntaxError并停止。这里要注意的重点是未运行任何代码。正如我所说的,Python对脚本的解析发生在之前,它试图运行脚本。这就是在第二个示例中第一行未运行的原因。 Python仍在解析脚本的阶段。

但是,在您的第一个示例中,Python已经解析了您的代码并验证了它具有有效的语法。现在,Python尝试执行您的代码。 Python解释器将继续运行直到,直到遇到错误,此时它将停止。这里要注意的重要一点是,Python在引发NameError时处于执行阶段。就像我在上面说的那样,Python将尽可能在脚本中执行代码。这就是为什么在您的第一个示例中,运行第一个语句,然后停止Python解释器的原因。

基本上,SyntaxErrorNameError是两种不同的异常类型。 SyntaxError's是在Python的解析阶段引发的,而NameError是在Python的执行(也就是运行时)阶段引发的。异常产生的输出是不同的,因为异常是在不同阶段,出于不同目的提出的。

答案 1 :(得分:0)

您从第二个示例中得到一个SyntaxError

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

因为第二行的print函数调用没有右括号

如果添加括号,您将得到一个NameError

正如其他人指出的那样,由于Python无法解析无效代码,因此您在解析时会得到SyntaxErrorNameError在运行时解析了代码,但其中包含未定义的变量名。