使用回溯查找错误

已完成

Python 中的异常是语言的核心功能。 你可能会惊讶地发现,错误的源头高亮显示为某个功能。 让你惊讶的原因是,可靠的软件工具似乎不会崩溃并产生回溯(多行文本,这些文本指示错误如何开始和结束)。

但异常非常有用,因为异常可以生成描述性错误消息以帮助决策。 它们有助于处理预期和意外的问题。

回溯

回溯是文本的正文,可指向未处理错误的来源(和终点)。 通过了解回溯的组成,你可以更高效地修复错误或调试不能正常工作的程序。

当你首次在 Python 中遇到异常时,可能会尝试通过取消显示来避免此错误。 当程序发生的错误未经处理时,回溯将显示为输出。 正如你在本模块中看到的那样,回溯非常有用。 有几种方法可以正确处理错误,使这些错误不会显示或仅显示有用信息。

打开 Python 交互式会话并尝试打开不存在的文件:

open("/path/to/mars.jpg")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/mars.jpg'

该输出具有几个关键部分。 首先,回溯提到输出的顺序。 然后,它会报告该文件为 stdin(交互式终端中的输入),位于输入的第一行。 错误为 FileNotFoundError(异常名称)异常,这意味着该文件不存在,或者可能不存在该文件的目录。

这里提供了大量信息。 很难理解为什么第 1 行是有意义的,或者 Errno 2 是什么意思。

在 Visual Studio Code 中打开所需的目录,并创建名为 open.py 的 Python 文件。

Screenshot showing the creation of a new Python file in Visual Studio Code.

将以下内容添加到该文件并保存:

def main():
    open("/path/to/mars.jpg")

if __name__ == '__main__':
    main()

它是单个 main() 函数,可像以前一样打开不存在的文件。 最后,此函数使用 Python 帮助程序,当终端上调用 main() 函数时,该帮助程序通知解释器执行该函数。 使用 Python 在 Bash 终端中运行命令,并检查错误消息:

python3 open.py
Traceback (most recent call last):
  File "/tmp/open.py", line 5, in <module>
    main()
  File "/tmp/open.py", line 2, in main
    open("/path/to/mars.jpg")
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/mars.jpg'

错误输出现在就比较有意义了。 路径指向名为 open.py 的单个文件。 输出提到错误在第 5 行开始,其中包括对 main() 的调用。 接下来,输出跟踪错误至 open() 函数调用中的第2行。 最后,FileNotFoundError 再次报告文件或目录不存在。

回溯几乎始终包含以下信息:

  • 涉及对每个函数的每次调用的所有文件路径。
  • 与每个文件路径关联的行号。
  • 产生异常时涉及的函数、方法或类的名称。
  • 引发的异常的名称。