目录
4)try……except……else……finally结构
一、Bug的常见类型
1、粗心导致的语法错误 SyntaxError
如:input()函数返回的是str类型,str类型不能直接与int类型进行比较
# input()函数返回的是str类型,str类型不能直接与int类型进行比较
age = input('请输入年龄:')
if age > 10: # 报错 TypeError: '>' not supported between instances of 'str' and 'int'
print(age)
如:变量未初始化,循环处理未自增
# 变量未初始化,循环处理未自增
while i < 10: # NameError: name 'i' is not defined
print(i)
如:if的条件判断表达式,错误使用了赋值符号=,应该要使用==判断是否相等;
# if的条件判断表达式,错误使用了赋值符号=
uname = input("name:")
pwd = input("password:")
if uname = 'test' and pwd = 'test': # SyntaxError: invalid syntax
print('用户登录成功')
粗心导致错误的自查宝典
- 漏了末尾的冒号,如if语句,循环语句,else子句等;
- 缩进错误,该缩进的没缩进,不该缩进的瞎缩进;
- 把英文符号写成中文符号,比如:引号,冒号,括号;
- 字符串拼接的时候,把字符串和数字拼在一起;
- 没有定义变量,比如while的循环条件的变量;
- ==比较运算符和=赋值运算符的混用;
2、知识不熟练导致的错误
如:索引越界问题IndexError
# 索引越界问题IndexError
lst = [10, 20, 30]
print(lst[3]) # IndexError: list index out of range
如:append()方法的使用掌握不熟练
# append()方法只能添加一个元素
lst = [10, 20, 30]
lst = append(40) # 写法错误,应该为lst.append(40),报错NameError: name 'append' is not defined
lst.append(40,50) # 只能添加一个元素, 报错TypeError: append() takes exactly one argument (2 given)
知识点不熟悉导致错误的自查宝典:练,练,练,多练习
3、思路不清导致的问题解决方案
- 问题前后,使用print()函数,打印变量输出
- 使用#暂时注释部分代码
# 输入演员名字,显示出演了哪部电影
lst = [{'rating': [9.7, 1], 'id':'1001', 'type': ['犯罪', '剧情'], 'title':'我和我的家乡', 'actors': ['葛优', '黄渤', '范伟', '邓超']},
{'rating': [8.7, 2], 'id':'1002', 'type': ['爱情', '剧情'], 'title':'夺冠', 'actors': ['巩俐', '黄渤', '吴刚']},
{'rating': [7.7, 3], 'id':'1003', 'type': ['悬疑', '剧情'], 'title':'姜子牙', 'actors': ['郑希', '杨凝']}]
name = input('请输入演员姓名:')
count = 0
for movie in lst:
for actor in movie['actors']:
if name == actor:
print("演员: ", name ,", 出演了电影:", movie['title'], ", 豆瓣评分:", movie['rating'][0])
count += 1
if count == 0:
print('演员: ', name, '没有电影作品。')
elif count > 0:
print('演员: ', name, '出演了', count, "部电影")
else:
print('出现了不可预期的异常')
输出结果:
请输入演员姓名:黄渤
演员: 黄渤 , 出演了电影: 我和我的家乡 , 豆瓣评分: 9.7
演员: 黄渤 , 出演了电影: 夺冠 , 豆瓣评分: 8.7
演员: 黄渤 出演了 2 部电影
4、被动掉坑
- 程序代码逻辑没有错误,只是因为用户错误操作或者一些“例外情况”而导致的程序崩溃;
如:除法计算器,未做输入非整数判断,未做被除数为0时的判断;
# 除法计算器
x = input('请输入除数:')
y = input('请输入被除数:')
# 未做被除数为0时的判断,报错:ZeroDivisionError: division by zero
# 未做输入非整数判断,报错:ValueError: invalid literal for int() with base 10: 'a'
result = int(x)/int(y)
print('结果是:', result)
二、python的异常处理机制
- 在异常出现时即时捕获,内部“消化”,让程序继续运行;
1、异常处理机制
1)单个except异常处理的语法:
try:
可能会出异常的代码
except 异常类型:
异常处理代码(报错后执行的代码)
2)多个except结构语法:
- 捕获异常的顺序,按照先子类,后父亲类的顺序;
- 为了避免遗漏可能出现的异常,可以在最后增加BaseException;
try:
可能会出异常的代码
except Exception1:
异常处理代码
except Exception2:
异常处理代码
except BaseException:
异常处理代码
# 除法计算器
try:
x = input('请输入除数:')
y = input('请输入被除数:')
result = int(x)/int(y)
print('结果是:', result)
except ZeroDivisionError:
print('除数不能为0')
# except ValueError:
# print('不能输入非数字')
except BaseException as e:
print(e) # 输入非数字后,显示报错信息:invalid literal for int() with base 10: 'a'
print('程序结束')
输出结果:执行完异常输出后,程序继续运行,输出“程序结束”
请输入除数:a
请输入被除数:2
invalid literal for int() with base 10: 'a'
程序结束
3)try……except……else结构
- 如果try块中没有抛出异常,则执行else块;
- 如果try块中抛出异常,则执行except块;
# 除法计算器
try:
x = input('请输入除数:')
y = input('请输入被除数:')
result = int(x)/int(y)
except BaseException as e:
print('出错了,', e)
else:
print('结果是:', result)
print('程序运行结束')
输出结果1:
请输入除数:10
请输入被除数:2
结果是: 5.0
程序运行结束
输出结果2:
请输入除数:a
请输入被除数:3
出错了, invalid literal for int() with base 10: 'a'
程序运行结束
4)try……except……else……finally结构
- finally块,无论是否发生异常,都会被执行,常用来释放try块中申请的资源;
# 除法计算器
try:
x = input('请输入除数:')
y = input('请输入被除数:')
result = int(x)/int(y)
except BaseException as e:
print('出错了,', e)
else:
print('结果是:', result)
finally:
print('无论是否发生异常,都会被执行的代码')
print('程序运行结束')
输出结果1:
请输入除数:10
请输入被除数:2
结果是: 5.0
无论是否发生异常,都会被执行的代码
程序运行结束
输出结果2:
请输入除数:a
请输入被除数:3
出错了, invalid literal for int() with base 10: 'a'
无论是否发生异常,都会被执行的代码
程序运行结束
2、python中常见的异常类型
ZeroDivisionError | 除(或取模)零(所有数据类型) |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
NameError | 未声明/未初始化对象(没有属性) |
SyntaxError | Python语法错误 |
ValueError | 传入无效的参数 |
3、traceback模块
- 使用traceback模块打印异常信息
# traceback模块打印异常日志
import traceback
try:
num = 10/0
except:
print('-------这是traceback模块打印的信息-------')
traceback.print_exc()
输出结果:
-------这是traceback模块打印的信息-------
Traceback (most recent call last):
File "D:/Nikey/Python/PyCharm/basicProgram/basic/tmp.py", line 4, in <module>
num = 10/0
ZeroDivisionError: division by zero