什么是异常?
当程序进行中检测到一个错误时,无法继续执行,出现了一些错误的提示,这就是所谓的“异常”
一、常见代码异常
1、变量没定义:NameError
2、语法错误:SyntaxError
3、键不存在:KeyError
4、没找到模块:ModuleNotFoundError
5、类型错误:TypeError
二、异常类型介绍
三、异常分析
报错信息的三部分:
第一部分:最后一行展示异常类型
第二部分:错误信息
第三部分:异常追踪
寻找错误代码:从下往上寻找文件,自己写的文件中代码有问题,导致其他模块的代码出现问题。内置的模块一般是不会错的~
四、异常捕获:通过异常捕获可以提高代码的容错性
try:有可能会出现错误的代码,放在try下面
except:当try里面的代码出错了,就会执行except里面的代码(可以在此处,处理异常)
else:代码没有出现异常才会执行
finally:不管有没有异常都会执行
try:
# 有可能会出现错误的代码,放到try下面
num = int(input("请输入一个数值:"))
except:
# 当try里面的代码出错了,就会执行except里面的代码(可以在此处处理异常)
print("您输入的不是数字!,默认输入的是0")
num = 0
else:
# 代码不出错才会执行
print("else:try里面的代码没有出错")
a = num / 2
print(a)
finally:
# 不管出不出错都会执行
print("------finally-------------")
print("程序的其他代码")
运行结果1(输入错误):
请输入一个数值:kkk
您输入的不是数字!,默认输入的是0
------finally-------------
程序的其他代码
运行结果2(输入符合):
请输入一个数值:88
else:try里面的代码没有出错
44.0
------finally-------------
程序的其他代码
五、异常处理
一、try——except
1.try里面的代码(不可控因素造成的错误需要使用try来异常捕获):
1)涉及用户输入(用户输入的内容不是数字)
2)涉及到文件操作(文件不存在、路径不存在)
3)涉及到网络请求(请求接口时,网络不好)
注意:语法错误try捕获不了
2.捕获指定的异常类型,不同的异常类型做不同的处理
try:
num = int(input("请输入一个数值:"))
print(a)
except ValueError:
print("捕获到了ValueError")
except NameError:
print("捕获到了NameError")
运行结果1:
请输入一个数值:100
捕获到了NameError
运行结果2:
请输入一个数值:啊啊啊
捕获到了ValueError
try:
num = int(input("请输入一个数值:"))
print(a)
# 想看异常信息可以通过e变量来看,变量名可以随便的
except ValueError as e:
print("捕获到了ValueError:{}".format(e))
except NameError as e:
print("捕获到了NameError:{}".format(e))
运行结果1:
请输入一个数值:啊啊啊
捕获到了ValueError:invalid literal for int() with base 10: ‘啊啊啊’
运行结果2:
请输入一个数值:111
捕获到了NameError:name ‘a’ is not defined
3.所有的异常类型,做相同的处理
try:
num = int(input("请输入一个数值:"))
print(a)
# 捕获所有异常类型,缺点没有办法获取异常信息
except :
print("捕获到了异常")
try:
num = int(input("请输入一个数值:"))
print(a)
except Exception as e:
print("捕获到了异常:{}".format(e))
运作结果1:
请输入一个数值:33
捕获到了异常:name ‘a’ is not defined
运行结果2:
请输入一个数值:aa
捕获到了异常:invalid literal for int() with base 10: ‘aa’
不建议捕获所有异常类型,能确定异常类型就指定异常类型。不方便做针对性的处理。
4.一个except捕获指定的多个异常类型:用元组的形式写
try:
num = int(input("请输入一个数值:"))
print(a)
# 捕获多个异常类型,不同的异常类型做统一的处理
except (ValueError,NameError) as e:
print("捕获到了异常:{}".format(e))
运行结果1:
请输入一个数值:222
捕获到了异常:name ‘a’ is not defined
运行结果2:
请输入一个数值:aa
捕获到了异常:invalid literal for int() with base 10: ‘aa’
5.Exception捕获所有异常类型
try:
num = int(input("请输入一个数值:"))
print(a)
except Exception as e:
print("捕获到了异常:{}".format(e))
运作结果1:
请输入一个数值:33
捕获到了异常:name ‘a’ is not defined
运行结果2:
请输入一个数值:aa
捕获到了异常:invalid literal for int() with base 10: ‘aa’
补充:
BaseException 也可以捕获所有异常类型,可以理解为所有异常的祖宗,详见第二点异常类型介绍
try:
num = int(input("请输入一个数值:"))
print(a)
except BaseException as e:
print("捕获到了异常:{}".format(e))
二、try——except——else
1.try中的内容报错了,不执行else
# name = 111
try:
print(name)
except Exception as e:
print("代码报错了")
print(e)
else:
print("try里面的代码没有出错")
运行结果:代码报错了
name ‘name’ is not defined
2.try中的内容没报错,执行else
name = 111
try:
print(name)
except Exception as e:
print("代码报错了")
print(e)
else:
print("try里面的代码没有出错")
运行结果:111
try里面的代码没有出错
三、try——except——else——finally
1、代码报错,会执行finally
name = 111
try:
a = 100 / 5
print(name)
f = open("111.py", 'w')
f.write([111, 33, 444])
except NameError as e:
print("代码报错了")
print(e)
else:
# 代码不出错才会执行
print("else:try里面的代码没有出错")
finally:
# 不管出不出错都会执行
print("------finally-------------")
f.close()
print("888888888888888888888888")
运行结果:111
------finally-------------
TypeError: write() argument must be str, not list
2、代码不报错,会执行finally
name = 111
try:
a = 100 / 5
print(name)
f = open("111.py", 'w')
f.write([111, 33, 444])
except Exception as e:
print("代码报错了")
print(e)
else:
# 代码不出错才会执行
print("else:try里面的代码没有出错")
finally:
# 不管出不出错都会执行
print("------finally-------------")
f.close()
print("888888888888888888888888")
运行结果:111
代码报错了
write() argument must be str, not list
------finally-------------
888888888888888888888888
3、实际应用:open打开文件,代码报错后,没有捕获到,没有close,这时可以在finally中关掉
数据库也是如此,操作数据库报错后,也可以关闭数据库连接
try:
f = open("111.py", 'w')
f.write([111, 33, 444])
except NameError as e:
print("代码报错了")
print(e)
else:
# 代码不出错才会执行
print("else:try里面的代码没有出错")
finally:
# 不管出不出错都会执行
print("------finally-------------")
f.close()
print("888888888888888888888888")
六、断言(assert )
什么是断言?
assert 后面跟一个条件语句,如果条件不成立就会触发断言异常
res='666'
expected='888'
assert res==expected
res='666'
expected='888'
try:
assert res == expected
except AssertionError as e:
print("用例不通过")
else:
print("用例通过")
运行结果:
用例不通过
res='888'
expected='888'
try:
assert res == expected
except AssertionError as e:
print("用例不通过")
else:
print("用例通过")
运行结果:
用例通过
七、主动引发一个异常(raise)
res='8889'
expected='888'
try:
assert res == expected
except AssertionError as e:
print("用例不通过")
raise e
执行结果: