最后,greet_many()将遍历people列表并调用greet() 。如果调用greet()时引发异常,则打印出一个简单的备份问候语 。
只要你提供了正确的输入,这段代码没有任何bug会引发异常 。
如果你在greetings.py的底部添加一个greet()调用,然后指定一个它无法预期的关键字参数(例如,greet('Chad',greting='Yo')),那你将得到以下回溯:

文章插图
同样,对于一个Python回溯,最好是向后处理,向上移动输出 。从回溯的最后一行开始,你可以看到异常是一个TypeError 。异常类型后面的消息(冒号后面的所有内容)为你提供了一些很好的信息 。它告诉你,greet()被调用时带有一个它没有预料到的关键字参数,并为你提供了未知参数的名称:greting 。
继续向上移动,你可以看到导致异常的行 。在本例中,这个行就是我们在greetings .py的底部添加的greet()调用 。
向上的下一行给出了代码所在文件的路径、代码所在文件的行号以及代码所在的模块 。在本例中,因为我们的代码没有使用任何其他Python模块,所以这里我们只会看到<module>,这意味着这就是正在被执行的文件 。
使用不同的文件和不同的输入,你可以看到回溯实际上会向你指出正确的方向来找到问题 。如果你正在进行跟踪,请从greetings.py底部删除有问题的greet()调用,并将以下文件添加到你的目录中:

文章插图
这里,你已经设置了另一个Python文件,该文件将导入前面的模块greetings.py,并从中使用greet() 。下面是运行example.py时会发生的事情:
文章插图
在本例中捕获的异常同样是一个TypeError,但这一次消息的帮助要小一些 。它告诉你,在代码的某个地方,它期望使用一个字符串,但是传入了一个整数 。
向上移动,你可以看到被执行的代码行 。然后是文件和代码的行号 。不过,这一次我们得到的不是<module>,而是正在被执行的函数的名称greet() 。
转到下一个被执行的代码行,我们看到传入了一个整数的有问题的greet()调用 。
有时在异常引发之后,另一段代码会捕获该异常并导致另一个异常 。在这些情况下,Python将按照接收异常的顺序输出所有异常回溯,同样会以最近一次抛出的异常的回溯结束 。
这可能有点令人困惑,这里有一个例子 。在greetings.py的底部添加一个对greet_many()的调用 。

文章插图
这将会打印出对所有三个人的问候语 。但是,如果你运行这段代码,你会看到一个输出多个回溯的例子:

文章插图
注意上面输出中以During handling开始的高亮显示的行 。在所有回溯之间,你将看到这一行 。它的消息非常清楚,当你的代码试图处理前一个异常时,又引发了另一个异常 。
注意: Python的显示以前异常回溯的特性是在Python 3中添加的 。在Python2中,你只会得到最后一个异常的回溯 。
你之前已经看到过前面的异常,就在你使用一个整数调用greet()时 。因为我们在要打招呼的人员列表中添加了一个1,所以我们可以预期得到相同的结果 。但是,函数greet_many()将greet()调用封装在一个try和except块中 。这样,当greet()引发异常时,greet_many()会打印一个默认的问候语 。
greetings.py的相关部分在这里被重复:

文章插图
因此,当greet()由于错误的整数输入而导致TypeError时,greet_many()会处理该异常并尝试打印一个简单的问候语 。这里的代码最终会导致另一个类似的异常 。它仍然试图添加一个字符串和一个整数 。
查看所有的回溯输出可以帮助你了解异常的真正原因 。有时,当你看到最后一个异常被引发,并由此产生回溯时,你仍然看不出哪里出错了 。在这些情况下,向上移动到前面的异常通常会让你更好地了解根本原因 。
Python中有哪些常见的回溯?在编程时,了解如何在程序引发异常时阅读Python回溯可能非常有用,但是了解一些更常见的回溯也可以提升编程的进程 。
下面是一些你可能会遇到的常见异常,它们被引发的原因和它们的含义,以及你可以在它们的回溯中找到的信息 。
推荐阅读
- 别人梦见我生小孩是什么征兆 别人梦见我生小孩
- 主板上到处都可以看到电容,每颗电容在每个电路作用是不一样的
- 亨利福特发展的制造技术是什么 亨利福特对汽车工业的贡献
- 什么是系统架构?
- 什么是微服务架构?
- 电脑为什么会死机?这几点原因需要了解一下
- 关于绿茶文化的介绍
- ELK交换机日志分析
- 茶叶,竟然是中国偷到印度的
- 关于白茶绿雪芽的来历介绍
