Bootstrap

Python之异常处理

什么是异常?

当程序进行中检测到一个错误时,无法继续执行,出现了一些错误的提示,这就是所谓的“异常”

一、常见代码异常

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

执行结果:
在这里插入图片描述

;