新手上路,如何debug调试程序?

简介: 写代码,不可避免地会出现bug。很多人在初学编程的时候,当写完程序运行时,发现结果与自己预料中的不同,或者程序意外中止了,就一时没了想法,不知道该从何下手,只能反复重新运行程序,期待忽然有次结果就对了。

入门教程、案例源码、学习资料、读者群

请访问: python666.cn

大家好,欢迎来到 Crossin的编程教室 !

写代码,不可避免地会出现bug。很多人在初学编程的时候,当写完程序运行时,发现结果与自己预料中的不同,或者程序意外中止了,就一时没了想法,不知道该从何下手,只能反复重新运行程序,期待忽然有次结果就对了。

今天我就来分享一些代码遇到问题时的调试经验和解决技巧,希望对你有所帮助。

1. 读错误信息

来看如下一个例程:


import random
a = 0
for i in range(5):
    b = random.choice(range(5))
    a += i / b
print(a)


这个程序中,i 从 0 循环到 4,每次循环中,b 是 0 到 4 中的一个随机数。把 i / b 的结果累加到 a 上,最后输出结果。

运行这段程序,有时候会输出结果,有时候却跳出错误信息:


Traceback (most recent call last):
  File "C:\Users\Crossin\Desktop\py\test.py", line 6, in <module>
    a += i / b
ZeroDivisionError: integer division or modulo by zero


有些同学看见一段英文提示就慌了。其实没那么复杂,python的错误提示做得还是很标准的。

它告诉我们错误发生在test.py文件中的第6行

a += i / b

这一句上。

这个错误是“ZeroDivisionError”,也就是除零错。

integer division or modulo by zero”,整数被0除或者被0模(取余数)。

因为0不能作为除数,所以当b随机到0的时候,就会引发这个错误。

知道了原因,就可以顺利地解决掉这个bug。

以后在写代码的时候,如果遇到了错误,先别急着去改代码。试着去读一读错误提示,看看里面都说了些啥。

2. 输出调试信息

我们在所有课程的最开始就教了输出函数“print”。它是编程中最简单的调试手段。有的时候,仅从错误提示仍然无法判断出程序错误的原因,或者没有发生错误,但程序的结果就是不对。这种情况下,通过输出程序过程中的一些状态,可以帮助分析程序。

把前面那个程序改造一下,加入一些与程序功能无关的输出语句:


import random
a = 0
for i in range(5):
    print('i:', i)
    b = random.choice(range(5))
    print('b:', b)
    a += i / b
    print('a:', a)
    print()
print(a)


行后的输出结果(每次结果都会不一样):


i: 0
b: 3
a: 0.0
i: 1
b: 4
a: 0.25
i: 2
b: 0
Traceback (most recent call last):
  File "C:\Users\Crossin\Desktop\py\test.py", line 8, in <module>
    a += i / b
ZeroDivisionError: integer division or modulo by zero


当b的值为0时,发生了除零错。这次可以更清晰地看出程序出错时的状态。

在真实开发中,程序的结构可能会非常复杂。通过输出调试信息,可以有效地缩小范围、定位错误发生的位置,确认错误发生时的场景,进而找出错误原因。

还有其他一些调试技巧,如使用断点调试,借助IDE的错误提示等,可以参考我之前写过的文章:

开发5分钟,调试2小时 - 你的问题在哪里?

如何在 Python 中使用断点调试

目录
打赏
0
0
0
0
11
分享
相关文章
nacos常见问题之在web界面 上下线服务时报错 400如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
271 0
Ubuntu 安全重启 / Ubuntu 系统死机解决方法
初装Ubuntu双系统时,经常会遇到各种各样的问题导致系统崩溃、卡死、黑屏等情况,新手或者小白可能直接选择长按电源键强制重启了
3651 0
B树和B+树的插入、删除图文详解
B树和B+树的插入、删除图文详解
323 0
C语言 多进程编程(七)信号量
本文档详细介绍了进程间通信中的信号量机制。首先解释了资源竞争、临界资源和临界区的概念,并重点阐述了信号量如何解决这些问题。信号量作为一种协调共享资源访问的机制,包括互斥和同步两方面。文档还详细描述了无名信号量的初始化、等待、释放及销毁等操作,并提供了相应的 C 语言示例代码。此外,还介绍了如何创建信号量集合、初始化信号量以及信号量的操作方法。最后,通过实际示例展示了信号量在进程互斥和同步中的应用,包括如何使用信号量避免资源竞争,并实现了父子进程间的同步输出。附带的 `sem.h` 和 `sem.c` 文件提供了信号量操作的具体实现。
什么是 `def` 语句?
`def` 是 Python 中定义函数的关键字,用于创建可重用代码块。函数可以有参数,如`greet_with_name(name)`,默认参数,如`greet_with_default(name=&quot;Guest&quot;)`,并能通过`return`返回值。Python函数还能返回多个值,如元组。`lambda`用于创建匿名函数,而函数本身可以作为其他函数的参数,实现函数式编程。递归函数(如`factorial(n)`)能调用自身。嵌套函数允许在函数内部定义私有函数,装饰器通过`@`符号修饰函数,扩展其功能。掌握这些概念能提升代码的模块化和效率。
305 2
深度解析:Linux内核的进程调度机制
【5月更文挑战第29天】 在现代操作系统中,尤其是类Unix系统如Linux中,进程调度机制是保证多任务高效运行的核心。本文将深入探讨Linux操作系统内核的进程调度器——负责管理CPU资源分配的关键组件。我们会详细分析其调度策略、调度器的演进及其在多核处理器环境下的表现。通过剖析进程调度器的工作原理和设计哲学,旨在为读者提供一个清晰的视角来理解这一复杂的系统功能。
372 0
【C++ 职业方向】C++ 职业方向探索:工作职责、编程技能与MBTI人格匹配
【C++ 职业方向】C++ 职业方向探索:工作职责、编程技能与MBTI人格匹配
900 1
Unix/Linux操作系统的最强入门科普(经典)
Unix/Linux操作系统的最强入门科普(经典)
680 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等