Skip to content

错误分析与调试

调试与分析

在编写程序过程中,出现错误是再所难免的,出现错误后,如何能通过报错信息,快速找出并修复错误,是代码开发过程中非常重要的技能。

错误分析

程序出现错误并中断结束后,出现报错信息的错误都是不可怕的,大多都是一些语法性的错误,通过错误提示信息,就可以快速定位和解决错误。

错误分析:

  1. 错误所在的文件
  2. 错误所在的行
  3. 错误出现的代码
  4. 错误类型
  5. 错误原因描述

有时候通过报错信息,并不能直接定位出错误,要通过报错信息,及程序的上下文逻辑来分析真正的报错原因。

在上面的错误中,共提示了两处报错位置,分别是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 runoutput 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: 停止 Debug
  • View Breakpoints: 显示程序中所有的断点。
  • Mute Breakpoints: 让所有断点失效,使用后所有断点为灰色,debug时,代码不会在断点处暂停。
  • Pin Tab: 钉住当前调试窗口标签,防止关闭。