异常:
程序遇到异常会终止执行并报错:a = 3/0 #除数不能为0,报错
想要改变程序遇到异常中止,继续执行后面的代码的行为--------------->异常捕获
最基本的捕获:
缺点:不能具体发现程序出了什么问题
try:
你要执行的可能发生异常的代码
except:
程序发生异常后,你希望程序做的事情
示例:
#直接在except中打印出你的提示语
try:
print('正在运行程序')
a = 1/0
print(f'计算结果:{a}') #不会执行,上一句异常,直接到except中
except:
print('这里有个异常!!!')
知道可能出现什么类型的异常
示例1:
try:
print('正在运行程序')
a = 1/0
print(f'计算结果:{a}') #不会执行,出错后,直接到except
except ZeroDivisionError as err:
print(err)
print('剩下的程序')
示例2:
try:
print('正在运行程序')
b = [0, 1]
b[3]
a = 1 / 0
except IndexError as e:
print(e)
示例3:
try:
print('正在运行程序')
a = 1 / 0
b = [0, 1]
b[3]
except IndexError as e: #报错,因为a = 1/0,会报异常,而IndexError抓不住这个异常,程序终止并报错
print(e)
示例3这种就需要重新考虑了,往往在写代码的时候你可能只会猜出会出现的错误类型,不会像示例1、2这样知道哪个类型的异常在前面,这种情况就需要换一种方式来捕获:多类型异常的捕获
两种方法:
1、异常统一处理
try:
lst = ['a', 'b'] #抛异常,except中不能处理,报错
lst[3]
a = 1/0 #抛异常,后面不会执行,直接进入except
except (ZeroDivisionError, IndexError) as err:
print(err) #先捕获到哪个,err代表哪个
print('请修改')
2、异常分开处理
try:
lst = ['a', 'b'] #抛异常,except中不能处理,报错
lst[3]
a = 1/0 #抛异常,后面不会执行,直接进入except
except ZeroDivisionError as err:
print(err)
print('请修改除数')
except IndexError as err:
print(err)
print('请修改下标')
捕获未知类型的异常
try:
你要执行的可能发生异常的代码
except Exception:
程序发生异常后,你希望程序做的
打印异常信息
try:
你要执行的可能发生异常的代码
except Exception as e:
print(e) #打印错误类型
示例:
try:
lst = ['a', 'b'] # 抛异常,except中不能处理,报错
lst[3]
a = 1 / 0
except Exception as e:
print(f'全能警察:{e}') #打印错误类型
不论代码报不报异常,都会执行finally中的代码
#不论代码报不报异常,都会执行finally中的f.close()关闭文件
import io
try:
f = open('demo.py', 'a')
f.read()#读取不了
except io.UnsupportedOperation as e:
print("文件读取失败")
finally:
f.close()
else中的代码,程序不报异常时执行,因此写在try中的后面效果一样
try:
1 / 0
print('1、正常时执行')
except ZeroDivisionError as e:
print('2、报错时执行')
else:
print('3、正常执行的代码')
上面的写法跟下面的写法没有区别,完全一样
try:
1 / 0
print('1、正常时执行')
print('3、正常执行的代码')
except ZeroDivisionError as e:
print('2、报错时执行')
自首后程序终止运行,主动触发异常
def get_age(age):
if age < 0:
raise ValueError('年龄不能为负数')
return age
try:
get_age(-2)
except Exception as e:
print(e)
断言的作用:判断真假
断言成功,程序继续运行
断言失败,触发异常AssertionError,程序终止并报错
用在预期结果和实际结果的对照,结果不相符时,证明程序出现bug
expect1 = {'code':0, 'msg':'用户已存在'}
act1 = {'code':0, 'msg':'用户已存在!'}
expect2 = {'code':1, 'msg':'注册成功'}
act2 = {'code':1, 'msg':'注册成功'}
try:
assert expect1 == act1
print('断言成功')
except:
print('断言失败:实际结果和预期结果不相符')
try:
assert expect2 == act2
print('断言成功')
except:
print('断言失败:实际结果和预期结果不相符')
def grade_avg():
while 1:
math = input('请输入数学成绩:')
chinese = input('请输入语文成绩:')
try:
math = float(math)
chinese = float(chinese)
break
except ValueError as e: # valueerror,不是数字
print('请输入正确的成绩', e)
return (math + chinese) / 2
print(grade_avg())