假设我在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编译方式有什么区别,即使在后续错误中,它至少能够成功执行第一行代码(您好,世界!)行,但是在第二个错误中,由于后续错误,它不会执行第一行代码吗?
答案 0 :(得分:3)
您看到两个例外的输出不同的原因是,一个是 运行时例外 ,而另一个是 。
在Python可以运行您的脚本之前,它必须解析您的代码并将其转换为Python字节码。 Python会通过验证语法是否有效来解析您的代码。如果Python发现您的脚本包含无效语法,它将引发SyntaxError
并停止。这里要注意的重点是未运行任何代码。正如我所说的,Python对脚本的解析发生在之前,它试图运行脚本。这就是在第二个示例中第一行未运行的原因。 Python仍在解析脚本的阶段。
但是,在您的第一个示例中,Python已经解析了您的代码并验证了它具有有效的语法。现在,Python尝试执行您的代码。 Python解释器将继续运行直到,直到遇到错误,此时它将停止。这里要注意的重要一点是,Python在引发NameError
时处于执行阶段。就像我在上面说的那样,Python将尽可能在脚本中执行代码。这就是为什么在您的第一个示例中,运行第一个语句,然后停止Python解释器的原因。
基本上,SyntaxError
和NameError
是两种不同的异常类型。 SyntaxError's
是在Python的解析阶段引发的,而NameError
是在Python的执行(也就是运行时)阶段引发的。异常产生的输出是不同的,因为异常是在不同阶段,出于不同目的提出的。
答案 1 :(得分:0)
您从第二个示例中得到一个SyntaxError
:
print("Hello, world!")
print("What a great day!"
thisIsMyError
因为第二行的print
函数调用没有右括号。
如果添加括号,您将得到一个NameError
。
正如其他人指出的那样,由于Python无法解析无效代码,因此您在解析时会得到SyntaxError
。 NameError
在运行时解析了代码,但其中包含未定义的变量名。