错误分析与调试
调试与分析
在编写程序过程中,出现错误是再所难免的,出现错误后,如何能通过报错信息,快速找出并修复错误,是代码开发过程中非常重要的技能。
错误分析
程序出现错误并中断结束后,出现报错信息的错误都是不可怕的,大多都是一些语法性的错误,通过错误提示信息,就可以快速定位和解决错误。
错误分析:
- 错误所在的文件
- 错误所在的行
- 错误出现的代码
- 错误类型
- 错误原因描述
有时候通过报错信息,并不能直接定位出错误,要通过报错信息,及程序的上下文逻辑来分析真正的报错原因。
在上面的错误中,共提示了两处报错位置,分别是12行和7行,这是代码追踪提示。
但真正的错误并不在这里,通过错误原因描述发现,是在执行range()函数时,并不能将字符串类型的参数解释成一个数字。
从代码实现逻辑上看,output
函数并没有任何问题,结合上下文的代码逻辑发现,问题出在 getInputData
函数中的数据获取,从键盘输入的所有内容都是以字符串形式保存到程序变量中,程序要求获得一个数字,那么在键盘输入后,应该使用强制类型转换,将输入数据转换成数字。
n = input("请输入一个数字:")
修改为n = int(input("请输入一个数字:"))
print信息调试
很多人由于英文不太好,在查看报错信息时很吃力,也可以通过 print()
函数,自行输出信息来定位错误位置,虽然这种方式可以解决问题,但还是要慢慢学习,掌握如何查看报错提示。
示例代码:
def getInputData():
print("input run")
n = input("请输入一个数字:")
msg = input("请输入一个数据:")
return n,msg
def outputData(n,msg):
print("output run")
for i in range(n):
print("output forin run")
print(msg)
if __name__ == '__main__':
n,msg = getInputData()
outputData(n, msg)
运行结果:
input run
请输入一个数字:1
请输入一个数据:1
output run
Traceback (most recent call last):
File "/Users/liusuhui/Desktop/RecordCode/main.py", line 15, in <module>
outputData(n, msg)
File "/Users/liusuhui/Desktop/RecordCode/main.py", line 9, in outputData
for i in range(n):
TypeError: 'str' object cannot be interpreted as an integer
Process finished with exit code 1
在示例代码中,加入了三条 print()
语句,用来输出一些信息,通过运行结果可以看出,input run
和 output run
都被正常输出,而 output forin run
没有输出,说明程序在输出该语句之前出现错误,此时就可以通过检查语法信息,上下文逻辑等来判断具体错误原因。
print()
语句在调试代码时,两条语句之间包含多少代码,视具体情况而定。不是必须在每条语句前后都加 print()
输出,在错误调试完成后,需要把输出注释或删除掉。
debug调试
除了前面两种方式外,还可以通过 PyCharm 的 debug
功能来调试程序,通过 debug
功能,还可以监控程序的执行过程。
在使用debug功能时,需要配合程序断点来进行调试。
程序断点
使用 PyCharm 编写代码时,可以在行号后通过点击添加删除断点。
断点的作用是在debug调试程序时,遇到断点程序就会暂停执行,通过点击控制按钮,控制程序向下执行。
调试控制
程序打好断点后,点击debug即可进入debug模式,程序遇到断点就会暂停执行,此时就需要通过控制按钮来控制程序的执行
横向按钮
Step Over
: 步过按钮,将函数做为一条语句执行,不进入函数内部执行。Step Into
: 单步执行,会进入到函数内部逐条执行代码。Step Into My Code
: 单步执行,只进入自定义函数内部,不会进入系统函数内部。Step Out
: 步出按钮,跳出当前函数体,返回到此函数调用位置Run to Cursor
: 运行到光标处,当调试程序时,如果某一行没有打断点,又想暂停,可以将光标移动到目标行,点击该按钮Evaluate Expression
: 评估表达式,高级用法,可以在调试过程中查看程序的中间过程,比如查看参数 n 的类型。
竖向按钮
Rerun main
: 重新运行 debug 功能Modify Run Configuration
: 修改运行配置Resume Program
: 继续执行,运行到下一断点处,如果没有,程序运行结束Stop main
: 停止 DebugView Breakpoints
: 显示程序中所有的断点。Mute Breakpoints
: 让所有断点失效,使用后所有断点为灰色,debug时,代码不会在断点处暂停。Pin Tab
: 钉住当前调试窗口标签,防止关闭。