很多学习Python的同学,在遇到程序报错的时候,看到那一坨报错信息会一脸懵逼,不知道该如何入手。
而事实上Python的报错信息其实非常简洁清晰。
如果知道如何阅读它们的话,可以帮助我们非常快速地定位并解决问题。
下面我会用一个非常简单的例子,给大家介绍一下Python报错信息的组成结构,告诉你应该怎么阅读这些信息,如何利用他们快速定位并解决问题。
示例程序及报错信息
这段程序非常简单,只有4行。
它在第1~2行定义了一个函数greet,并在第4行调用了这个函数。
# examply.py
def greet(someone):
print('Hello, ' + someon)
greet('Chad')
当你执行这段代码的时候,会出现以下报错信息:
$ python example.py
Traceback (most recent call last):
File "/path/to/example.py", line 4, in
greet('Chad')
File "/path/to/example.py", line 2, in greet
print('Hello, ' + someon)
NameError: name 'someon' is not defined
对于这个比代码还长的报错信息应该怎么阅读呢?其实很简单,真的非常简单。
如何理解Python的报错信息
我对刚刚的报错信息进行了标记,方便大家理解报错信息的组成结构。
这些报错信息总共包含三部分,我分别用蓝绿框(最后一行),黄框(中间部分)和黑框(最上面一行)进行了标记。
说明:为了方便你查看,我会在下文需要的时候再次插入这张图。
阅读顺序
这些报错信息,在Python里边被称为traceback。阅读traceback的顺序应该是从最后一行开始往上读。
篮框
首先看最后一行蓝框标记的位置,这里的内容会告诉你错误的类型,方便你快速理解这个报错。
在这个例子里错误类型是NameError。
Python的官方文档对NameError的定义是: raised when a local or global name is not found。
意思是说如果程序中出现了这个错误,那就意味着说有一个变量没有被找到,没有被定义。(我后面会出一篇文章介绍Python常见的错误,以及他们会在何时出现)
也就是说我们这个样例代码报错,是因为有个变量没有被定义,那是哪个变量没有定义呢。
绿框
我们继续看最后一行绿框标记的位置,这里的内容会提供更多更详细的信息帮助你理解报错。
刚刚通过篮框里的NameError这个错误类型,我们已经知道有个变量没有找到。绿框的内容会告诉你到底是哪个变量没有找到,在样例代码里就是someon。
如果你认真检查就会发现第2行代码的someon在最后少打了一个字母e,问题就在这里了,在这里加个字母e就好了。
问题就解决了,是不是很简单?
小结:通常来说,看报错信息的最后一行,就基本可以确定是哪里出错了。
黄框
如果经过仔细检查,仍然没有发现是哪个someon没有定义(尤其是写了一天代码或者代码量很大的时候),那就需要去看黄框里的报错信息了。
因为黄框里的信息会告诉你报错发生的具体位置。
别看黄框的报错信息有一大坨,看起来很复杂,但是你如果按照以下原则阅读这部分内容,其实也很简单。
1,阅读顺序同样是从最后一行往上读。
2,但这一部分要每连续两行为一组进行阅读。其中每一组的第1行会告诉你是在哪个文件的、哪个函数的、哪一行出错了,也就是会更直接的告诉你错误发生的位置。
在这个例子里就是/path/to/example.py这个文件的第2行在greet函数里报错了。
3,每组的第2行会把报错的那一行代码显示出来,在这里就是print(‘Hello, ‘ + someon)。
到此就就可以确定,是第2行的someon这个变量少了个e,于是问题就非常容易修复了,是不是相当简单?
说明:这部分内容其实是函数调用的过程展示,方便你查找具体报错的位置。
比如在程序里A函数调用了B函数,然后B函数调用了C函数,而C函数报错了,那么这里的内容会先显示C函数的信息,再显示B函数的信息,再显示A函数的信息,而且每一个函数的信息都是按两行来组织的,其中第1行展示位置,第2行展示对应的代码。
正如我们样例代码是在第4行调用了第1~2行定义的函数greet,而在第2行报错了,所以它会先显示第4行的函数调用信息,再显示第2行的调用信息。
正因为这样,我们的阅读顺序才是从下往上读,而且是每两行为一组进行查看。
黑框
最上面一行的内容是固定不变的,始终Traceback (most recent call last)”,可以忽略。
总结
以上给大家介绍了在看到Python报错信息的时候,应该如何阅读理解这些信息,通过他们快速定位到问题,并解决问题。
这里简单做下总结:
Python的报错信息包括了三部分内容,
其中最下面一行会告诉你程序错误的类型,
中间部分会告诉你错误发生的位置,
而最上面的第一行则是千年不变的内容,可以忽略。
因此报错信息需要按照从下向上的顺序去查看报错信息。
希望通过我的分享,让报错信息成为你进步路上的垫脚石,而不是阻碍你进步的绊脚石。
如果有其他疑问可以留言或者微信联系我。
耳东陪你一起走进Python编程世界。