如何轻松地解读Python的报错信息?

很多学习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编程世界。

你可能感兴趣的:(如何轻松地解读Python的报错信息?)