【51CTO.com快译】对于码农而言,如果说能够编写出有效的代码,会给他们带来满满的成就感的话;那么当其代码中出现缺陷、甚至是错误时,他们则会产生深深的挫败感。因此,为了避免在软件运行的过程中,出现各种意想不到的错误,我们需要通过针对程序的调试,来消除各种代码级别的错误。本文将以Python为例,和您讨论八种有关代码调试的优秀实践。
何为Python异常?
每当Python无法解释某段目标代码或命令时,程序往往会抛出异常。Python的各种异常,实际上是Python在执行代码时,出现的一组错误集合。
通常,Python会使用try和except块,来触发各种错误异常。由于可执行的命令往往位于try块之内,因此当try中的代码出现失败时,Python就会去执行except块中的代码。也就是说,except关键字中的语句本质上就是try块中的那些异常,Python只是将它们作为错误而触发罢了。当然,一个try...except块有时候也可能会包含多个带有except关键字的异常。其中包含了许多我们在Python中常见的典型错误与详细信息。
由于我们在使用各种内置函数、软件库或Python框架时,都可能会碰到异常,因此,即便您认真编写和遵守了正确的语法,也无法保证相关方法在调用和执行时不会出错。例如,您可能只编写了大约5行代码,但是Python程序会发现到您正在使用的某个库、框架或内置方法的源代码中,存在着预定义的相关异常,因此会在第200行处触发异常错误。
语法错误
当程序代码无法在语法层面上被识别时,Python通常会抛出语法级别的错误。如果您是Python的初学者,那么就可能会频繁地遇到此类语法错误。不过,由于这些错误比那些深层次的异常(in-depth exceptions)更易于被追溯,因此您一旦掌握了基本原理,就很容易对它们进行合理的处理。
如何调试你的Python代码
Python的典型异常包括:缩进、类型、以及名称错误等方面。它们既可能来自单行代码,也可能源于某个代码块。我们虽然没有统一的方法对其进行处置,但是可以根据各种实例和项目类型,去予以应对。下面,让我们来具体讨论可用于调试Python的八种方法。它们既可以被单独使用,也能够通过组合来增强效果。
1.检查错误描述
处理Python错误的可用方法之一是查看错误的描述。Python通常会在其错误输出的最后一行给予详细的说明。例如:在解析意外的EOF(End Of File)时,我们会发现它们通常与缺少括号有关。也就是说,当您尝试着从类或对象处调用某个错误的函数时,就会出现AttributeError之类无效的语法(invalid syntax)错误。因此,通过最终一行的“蛛丝马迹”,您往往能够成功地追踪错误的来源,并着手重写其相关的代码。
2.追踪错误的来源
Python的错误具有较强的代码行限定性(line-bound),在遇到错误时,您需要注意Python所指向的具体行号。例如,由于下面的代码会尝试着连接不同的数据类型(字符串和整数),因此会产生类型方面的错误(type error)。其错误信息指向了示例代码中的第2行:
示例代码:
- db = open("output.txt", "a")
- a = "Hello"+1
- b = "How do you do?"
- db.write(a+", "+b+"
- ")
错误信息:
- raceback (most recent call last):
- File "C:\Users\Omisola Idowu\Desktop\Lato
- oup
- ew.py", line 2, in
- a = "Hello"+1
- TypeError: can only concatenate str (not "int") to str
下面让我们再来看另一个错误示例:
代码:
- def findTotal(a):
- for i in a
- print(sum(i)*2)
错误信息:
- File "C:\Users\Omisola Idowu\Desktop\Lato
- oup
- ew.py", line 2
- for i in a
- ^
- SyntaxError: invalid syntax
显然,Python指出了第2行的语法错误。如果您熟悉Python的话,就能够一眼看出:实际上,这是因为在for循环后面缺少的一个冒号。
3.在命令行上利用Trace方法
虽然您可以使用内置的集成开发和学习环境(Integrated Development and Learning Environment,IDLE)去调试Python,但是它不一定适合大型的软件项目。因此,调试Python的可用方法之一实际上是采用命令行界面(command-line interface,CLI)。它与在JavaScript中运行console.log()有着相似的效果。
如果您在代码执行过程中遇到了错误,则可以启动CLI,并使用trace命令去试着运行有问题的脚本。其基本工作原理是对代码进行逐行检查,并对发现问题的地方予以解析。
若要调用该方法,请在命令行中,以如下方式运行代码文件:
- python -m trace --trace file_name.py
在大型项目中,虽然以上述方式运行整个脚本并不切实际,但是您可以创建一个单独的Python文件,将每个代码块(一次仅一段)逐个粘贴到该文件中,然后分别运行上述命令。在此,您可以将其视为单元性调试的一种特有形式。
4.测试您的代码
除了上述提到的异常原因之外,错误的布尔值(boolean)有时也会导致您的程序在部署中表现异常或出现错误。单元测试往往涉及到需要隔离代码中的某些单元(块或行),以测试具体的性能、效率、以及正确性等指标。它们对于程序代码而言都是极其重要的。在单元测试中,我们可以使用多种调试技术,来通过assert函数对代码的正确性进行分析,以及检查代码在运行过程中所需的时间等维度指标。
在实际生产环境中,我们可以创建一个名为test.py的单独Python文件,并在该文件中测试每个代码单元。如下代码段展示了单元测试的一个示例:
- data = {
- "guitars":[
- {"Seagull":"$260"},
- {"Fender":"$700"},
- {"Electric-acoustic":"$600"}
- ]
- }
- if len(data["guitars"])==2:
- for i in data["guitars"]:
- print(i)
- assert len(data["guitars"])==2, "Length less than what's required, should be 3"
可见,由于数组的长度小于3,因此Python会触发如下断言错误:
- AssertionError: Length less than what's required, should be 3
5.使用日志
作为调试代码的另一种方法,Python内置了一套日志库,可供日志的检查与勘误。您可以通过链接--https://docs.python.org/3/howto/logging.html,来进一步了解其工作原理,以及如何在控制台中的运行和捕获它们。如果您觉得在部署应用的过程中,无法通过控制台来查看到日志,则可以通过设置简单邮件传输协议(SMTP),以便于将代码日志以电子邮件的方式及时捕获与分析。
6.使用标准的Python调试器
Python有一个被称为pdb的、非常流行的板载调试器。由于它是内置的,因此您只需要将pdb导入待测试文件中即可。pdb模块可以通过对代码采取事后执行(post-mortem)的方式,来调试程序在运行过程中出现的突然崩溃现象。
您既可以将pdb用于运行整个Python文件,也可以仅执行某个单元,以深入到程序的每一行去发现潜在的错误。在实际使用中,您需要首先打开Python文件,然后通过importpdb;pdb.set_trace(),来启动pdb调试器。接着,您可以通过CLI运行待测试的Python文件(请参见--https://www.makeuseof.com/run-python-script/):
- Python Your_Python_file.py
通过如下带有h的命令,您可以查看到pdb的所有可用命令列表:
- (pdb) h
列表的输出如下图所示:
例如,您可以通过如下命令,来逐行罗列出代码:
- (pdb) l
7.使用IDE进行调试
IDE也是用于调试Python脚本的宝贵工具。其中:
- Visual Studio Code(https://code.visualstudio.com/download)能够协助您运行与调试Python程序中的各项功能。
- 作为一种语言类支持插件,Pylance可允许您在调试的模式下运行自己的代码。
- 作为另一个出色的IDE,Pycharm(https://www.jetbrains.com/pycharm/download/)可以帮助您更加深入地查找代码中的错误。
- Eclipse(http://www.eclipse.org/downloads/packages/)也提供了一个名为Pydev的第三方插件,以实现针对Python脚本的轻松调试。
8.在网上搜索解决方案
鉴于Python具有庞大的开发者社区,您不妨将互联网作为寻找解决Python代码问题的可靠资源。例如,Stackoverflow(https://stackoverflow.com/)便是一个流行的代码社区,您可以在其中进行各种互动式的问答。当然,YouTube上也包含了大量的有关Python编程的实用视频。
原文标题:How to Debug Your Python Code,作者:IDOWU OMISOLA
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】