- BUG的由来及分类
- 不同异常类型的处理方式
- 异常处理机制
- PyCharm的调试模式
BUG的由来及分类
世界第一部万用计算机进化版-马克2号
bug常见的类型
粗心导致的语法错误类型SyntaxError
(1)age=input('请输入你的年龄:')
if age>=18
print('成年人, 你该负法律责任了')
指出错误
input是str类型的 age也是str类型的 18是整数类型
使用转换字符来改错
age=input('请输入你的年龄:')
print(type(age))
if int(age)>=18:#将age转换为整数类型
print('成年人, 你该负法律责任了')
while i<10:
print(i)
错误没有给i赋值
改错如下
i=3
while i<10:
print(i)
i+=1#否则i将是一个死循环状态
========================================================================
for i in range(3): uname=input('亲输入用户名:') pwd=input('亲输入密码:') if uname='admin' and pwd='admin': print('登陆成功') break else print('输入有误') else print('对不起,三次据输入错误') 指出错误
赋值要用‘==’
else后没有加冒号:
for i in range(3):
uname=input('亲输入用户名:')
pwd=input('亲输入密码:')
if uname=='admin' and pwd=='admin':
print('登陆成功')
break
else:
print('输入有误')
else:
print('对不起,三次据输入错误')
粗心导致错误的自查宝典
- 漏了末尾的冒号,如if语句,循环语句else子句等
- 缩进错误,该缩进的没缩进,不该缩进的缩进
- 把英文字符写成中文字符,把数字和字符拼接在一起
- 没有定义变量,比如说while的循环条件变量
- “==”比较运算符和“==”赋值运算符的混用
bug的常见类型
知识不熟练导致的错误
索引越界问题IndexError
lst=[11, 22, 33, 44]
print(lst[4])
lst=[11, 22, 33, 44]#索引是从0开始的,在这里面没有第四个元素
#print(lst[4])
print(lst[3])
append()方法的使用掌握不熟练
lst=[]
lst=append('A', 'B', 'C')
print(lst)
错误:
append的使用方法不对
append的添加方式一次只能添加一个
lst=[]
#lst=append('A', 'B', 'C')
lst.append('A')
lst.append('B')
lst.append('C')
print(lst)
bug的常见类型
思路不清导致的问题解决方案
使用print()函数
使用’#'暂时注释部分代码
题目要求
豆瓣电影TOP250排行榜,使用列表存储电影信息
要求输入名字在屏幕上显示XXX出演了哪部电影
错误的代码
lst=[{'rating':[9, 7, 50], 'id':'1292052', 'type':['犯罪', '剧情'], 'title':'肖申克的救赎', 'acrots':['蒂姆.罗宾斯', '摩根.弗里曼']},
{'rating':[9, 6, 50], 'id':'1291546', 'type':['爱情', '剧情', '同性'], 'title':'霸王别姬', 'acrots':['张国荣', '张丰毅', '巩俐', '葛优']},
{'rating':[9, 6, 50], 'id':'1296141', 'type':['犯罪', '剧情'], 'title':'控方证人', 'acrots':['泰隆.鲍华', '玛丽.弗里曼']}]
name=input('请输入你要查询的演员:')
for item in lst:
for movie in item:
actors=movie['actors']
print(actors)
if name in actors:
print(name+'出演了:'+movie)
lst=[{'rating':[9, 7, 50], 'id':'1292052', 'type':['犯罪', '剧情'], 'title':'肖申克的救赎', 'acrots':['蒂姆.罗宾斯', '摩根.弗里曼']},
{'rating':[9, 6, 50], 'id':'1291546', 'type':['爱情', '剧情', '同性'], 'title':'霸王别姬', 'acrots':['张国荣', '张丰毅', '巩俐', '葛优']},
{'rating':[9, 6, 50], 'id':'1296141', 'type':['犯罪', '剧情'], 'title':'控方证人', 'acrots':['泰隆.鲍华', '玛丽.弗里曼']}]
name=input('请输入你要查询的演员:')
for item in lst:#遍历列表会得到一个花括号 item是一个又一个的字典
for movie in item:#遍历的字典,得到movie,是一个字典中的key
print(movie)
'''
actors=movie['actors']
print(actors)
if name in actors:
print(name+'出演了:'+movie)'''
结果
请输入你要查询的演员:张国荣
rating
id
type
title
acrots
rating
id
type
title
acrots
rating
id
type
title
acrots
Process finished with exit code 0
改正之后
lst=[{'rating':[9, 7, 50], 'id':'1292052', 'type':['犯罪', '剧情'], 'title':'肖申克的救赎', 'acrots':['蒂姆.罗宾斯', '摩根.弗里曼']},
{'rating':[9, 6, 50], 'id':'1291546', 'type':['爱情', '剧情', '同性'], 'title':'霸王别姬', 'acrots':['张国荣', '张丰毅', '巩俐', '葛优']},
{'rating':[9, 6, 50], 'id':'1296141', 'type':['犯罪', '剧情'], 'title':'控方证人', 'acrots':['泰隆.鲍华', '玛丽.弗里曼']}]
name=input('请输入你要查询的演员:')
for item in lst:#遍历列表会得到一个花括号 item是一个又一个的字典
act_lst=item['acrots']
for actor in act_lst:
if name in actor:
print(name, '出演了', item['title'])
'''
actors=movie['actors']
print(actors)
if name in actors:
print(name+'出演了:'+movie)'''
将不必要出错的注释掉
然后可以使用print()函数来检查调试
先将得到演员的列表
然后看演员是否在这个列表中
在的话输出这个演员和他所出演的电影的名称
===================================================================
被动掉坑:程序代码逻辑没有错只是因为,用户错误操作或者一些例外的情况而导致的程序崩溃
输入两个整数并进行除法运算
try:
a = int(input('请输入一个整数:'))
b = int(input('请输入另一个整数:'))
result = a / b
print('结果为:', result)
except ZeroDivisionError:
print('除数不能为o哦')
print('程序结束')
当除数为0时会报错我们可以使用这样的机制去将结果不报错
try:
.........
...........
.........
except ZerDivisionError
有多个错误的时候
捕获异常的顺序按照先子类后父亲类的顺序,为了避免遗漏的可能,可以在最后增加
BaseException
try:
.....
.....
.....
except Exception 1:
.........
..........
.........
except Exception 2:
.........
..........
.........
except BaseException:
..........
.........
..........
try...except...else
try:
a = int(input('请输入一个整数:'))
b = int(input('请输入另一个整数:'))
result = a / b
except BaseException as e:
print('出错了', e)
else:
print('计算结果为:', result)
try...except...else..finally
try:
a = int(input('请输入一个整数:'))
b = int(input('请输入另一个整数:'))
result = a / b
except BaseException as e:
print('出错了', e)
else:
print('计算结果为:', result)
finally:
print('谢谢您的使用')
序号 | 异常类型 | 描述 |
1 | ZeroDivisionError | 除(或取模)零(所有数据类型) |
2 | IndexError | 序列中没有此索引(index) |
3 | KeyError | 映射中没有这个键 |
4 | NameError | 未声明/初始化对象没有属性 |
5 | SyntaxError | Python 语法错误 |
6 | ValueError | 传入无效的参数据 |
traceback模块
import traceback
try:
print('1-----------------')
print(1/0)
except:
traceback.print_exc()
Traceback (most recent call last):
File "E:/新建文件夹/bug的常见类型.py", line 29, in <module>
print(1/0)
ZeroDivisionError: division by zero
bug常见的类型 | 粗心导致的语法错误 | 自查宝典 |
知识点不熟悉 | 练,练,练 | |
思路不清 | print()语句 | |
使用#注释 | ||
被动掉坑 | try except |