Bug的由来及分类
一、Bug的常见类型
1. 粗心导致的语法错误SyntaxError
(1) 数据类型错误
示例代码:
age=input('请输入你的年龄:') if age>=18: print('成年人....')
执行结果:执行报TypeError: '>' not supported between instances of 'str' and 'int',提示类型错误
说明:age=input()得到的是string类型,18的类型是int类型,两者无法比较,所以会报TypeError,此时就需要将age转换成int类型,然后再和18比较
正确代码如下:
age=input('请输入你的年龄:') print(type(age)) if int(age)>=18: print('成年人....')
执行结果:
2. 常见语法错误
#语法错误 while i<10: print(i)
说明:代码中有2个错误,一是没有定义 i 的值,应该要给 i 定义一个初始值,二是pint函数后面的括号是中文括号,应该要改成英文括号,于是改成:
i=0 while i<10: print(i)
执行以上代码会发现进入了死循环,i一直是0,会一直执行while函数一直打印0,应该要设置一个函数退出条件,在最后加上 i+=1
i=0 while i<10: print(i) i+=1
执行结果如下:
(3)粗心导致的语法错误,将 == 写成 =
Bug的常见错误
错误自查宝典:
1.漏了末尾的冒号,如if语句,循环语句,else子句等
2.缩进错误,该缩进的没缩进,不该缩进的瞎缩进
3.把英文符号写成中文符号,比如说:引号,冒号,括号
4.字符串拼接的时候,把字符串和数字拼在一起
5.没有定义变量,比如说while 的循环条件的变量
6.“==”比较运算符和“=”赋值运算符的混用
练习:豆瓣电影Top250排行,使用列表存储电影信息,要求输入名字在屏幕上显示xxx出演了哪部电影
'''豆瓣电影Top250排行,使用列表存储电影信息, 要求输入名字在屏幕上显示xxx出演了哪部电影''' lst=[{'rating':[9.7,50],'id':'1292052','type':['犯罪','剧情'],'title':'肖申克的救赎','actors':['蒂姆.罗宾斯','摩根.弗里曼']}, {'rating':[9.6,50],'id':'1291546','type':['爱情','剧情'],'title':'霸王别姬','actors':['张国荣','张丰毅','巩俐','葛优']}, {'rating':[9.6,50],'id':'1296141','type':['犯罪','剧情'],'title':'控方证人','actors':['泰隆.鲍华','玛琳.黛德丽']}] name=input('请输入演员名字:') for movie in lst: # print(movie) actor=movie['actors'] # print(actor) for item in actor: # print(item) if item==name: print(name,'出演了',movie['title'])
执行结果:
练习:输入两个整数并进行除法运算
'''要求输入2个整数并进行除法运算''' try: a=int(input('请输入一个整数:')) b=int(input('请再输入一个整数:')) print(a,type(a)) print(b,type(b)) print(a/b) except ZeroDivisionError: print('除数不能为0哦!!!') print('程序结束')
执行结果:
优化:当输入字符串时,提示只能输入数字
'''要求输入2个整数并进行除法运算''' try: a=int(input('请输入一个整数:')) b=int(input('请再输入一个整数:')) print(a,type(a)) print(b,type(b)) print('结果为:',a/b) except ZeroDivisionError: print('除数不能为0哦!!!') except ValueError: print('只能输入数字') print('程序结束')
执行结果:
Pyton的异常处理机制
1. try...except...else结构
- 如果try块中没有抛异常,则执行else块,如果try中抛出异常,则执行except块
代码举例:
输入2个数字,对输入的两个数字进行相除
try: a=int(input('请输入一个整数:')) b=int(input('请再输入一个整数:')) res=a/b except BaseException as e: print('出错了') print(e) else: print('结果为:',res)
执行结果:
2. try...except...else...finally结构
- finally块无论是否发生异常都会被执行,能常用来释放try块中申请的资源
图形示意图如下,无论是执行except或else,都会执行finally
'''try...except...else...finally结构 无论是执行except还是else,都会执行finally ''' try: a=int(input('请输入一个整数:')) b=int(input('请再输入一个整数:')) res=a/b except BaseException as e: print('出错了') print(e) else: print('结果为:',res) finally: print('感谢使用')
执行结果:
Python中常见的异常类型
代码举例:
- ZeroDivisionError举例
a=int(input('请输入一个整数:')) b=int(input('请再输入一个整数:')) res=a/b
执行结果:
- IndexError举例
'''没有索引错误''' lst=[11,22,33] print(lst[4])
执行结果:
- KeyError举例
'''映射中没有这个值''' dic={'name':'张三','age':20} print(dic['gender'])
执行结果:
- NameError举例:
print(name)
执行结果:
- SyntaxError举例
'''SyntaxError举例''' int a=20
执行结果:
ValueError举例:
'''ValueError举例''' a=int('hello')
执行结果:
traceback模块
- 使用traceback模块打印异常信息
当程序出现错误时,Python中默认使用Traceback进行日志打印,如下图
当然需要我们手动错误信息记录到日志文件时,需要手动处理traceback
import traceback try: print('-------------------') print(10/0) except: traceback.print_exc()
执行结果: