异常处理涉及的关键字:
try:
理解它是扫描器,将可能出现异常的代码放入其中;
如果在执行的过程中出现异常对象了,扫描器会立即察觉到此异常对象,
但是它没有处理它的能力,所以会将异常对象给到except(捕获器)进行处理
except:
理解它是捕获器,后面可以定义异常类型,并且和as关键字配合使用;
定义多个except是合法的,但是它的执行顺序是有由上往下,一旦匹配上某个except,之后的就不执行了;
匹配成功就理解将异常对象捕获住并且kill,顺便会执行except内部的代码
finally:
将一定需要被执行的代码定义其中,【记住】:finally一定会被执行(核心)
使用场景:像关闭文件、断开数据库连接等行为都可以放入到finally中
else:
位置在finally前,except后;效果/作用类似于循环
没有异常对象出现,else就会被执行,反之不会被执行
raise:
手动抛出一个异常类型的对象,定义:raise 异常类型(msg)
定义格式:
格式一:
try:
语句块1
except 异常类型1 as e:
语句块2
except 异常类型2 as e:
语句块3
except 异常类型3 as e:
语句块4
finally:
语句块5
【注意事项】:
以上的格式由多个except语句并列存在,每个except包含一种类型
如果它们之间没有子父类的关系(互斥),那么谁上谁下无所谓
如果它们之间存在子父类的关系(包含),那么小的在上,大的在下
格式二:
try:
语句块1
except 异常类型1 as e:
语句块2
except 异常类型2 as e:
语句块3
except 异常类型3 as e:
语句块4
except (异常类型4,异常类型5,...,异常类型m) as e:
finally:
语句块5
【格式说明】:
一个except具备多个捕获能力(捕获多种不同类型异常对象)
格式三:
try:
语句块1
except 异常类型1 as e:
语句块2
except 异常类型2 as e:
语句块3
except 异常类型3 as e:
语句块4
except (异常类型4,异常类型5,...,异常类型m) as e:
语句块5
except Exception as e:
语句块6
finally:
语句块7
【类型说明】:
Exception是所有异常类型的父类型,它都是定义在最后一个except的位置
格式三:
try:
语句块1
except 异常类型1 as e:
语句块2
except 异常类型2 as e:
语句块3
except 异常类型3 as e:
语句块4
except (异常类型4,异常类型5,...,异常类型m) as e:
语句块5
except:
语句块6
finally:
语句块7
【Exception的简化版使用】:
如果定义了except,那么它必须是最后一个except,它可以理解为是Exception的简化形式
注意事项:
1).try...finally这种格式是合法的,但是它丧失了解决异常对象的能力 --> 开发不会出现
2).else语句必须配合except使用,出现位置一定是在最后一个except的后面
3).常见的运行时异常类型:
ZeroDivisionError:分母为0的异常
TypeError:类型有误的异常
NameError:没有定义就使用的异常
IndexError:下标越界的异常
FileNotFoundError:文件找不到的异常
4).with open ... as ...语句可以优化原始的open操作!体现:它不需要手动close()文件对象
总结:学习异常对象简单归纳为5个关键字:try except finally else raise
1.异常体系:div(a,b):
print(a / b)
div(10,0)演示异常处理的方式一:try ... except ...:
print(10/0)
ZeroDivisionError e:
print(e)
:
print(+123)
TypeError e:
print(e)
:
print(a)
NameError e:
print(e)
:
lt = [1,2,3,4,5]
print(lt[5])
IndexError e:
print(e)
:
fr = open(,,encoding=)
print(fr.read())
fr.close()
FileNotFoundErroreprint(e)
(ZeroDivisionError,TypeError,NameError,IndexError,FileNotFoundError) e:
print()
Exception e:
print()
:
print()补充:except不能捕获处理类似于语法错误这种情况演示finally语句的使用:
将一定要被执行的代码定义在finally中,不管之前的代码怎么样(异常是否被解决),finally一定会被执行,在后期的学习和开发中,我们将关闭文件、关闭数据库连接等操作都定finally中:
fr = open(,) print(fr.read())
print(10 / 0)
print(10 / 0):
print()
:
print()
fr.close()
但是如果一开始就是一个打不开的文件,则也没有办法关闭文件啦fr = 0
:
fr = open(,) print(fr.read())
:
print()
:
print()
fr:
fr.close()
引入新的语法糖:with open...操作:不需要程序员认为的去书写close()函数open(,)fr:
print(fr.read())
解决异常也是一样
try:
withopen(r'C:\Users\Administrator\Desktop\a.txt','r') asfr:
print(fr.read())
except:
print('干掉啦,干掉啦...')
面试题:Finally案例:分别输出了哪些内容,返回值是多少func():
:
print()
print(10 / 2)
1 :
print()
2
:
print()
3
num = func()
print(num)
#结果得到是 我是try...
5.0
我是finally...
3如果题目改为如下,则func():
:
print()
print(10 / 0)
1
:
print()
2
:
print()
3
num = func()
print(num)
#结果得到是 我是try...
我是except...
我是finally...
3:
print()
print(10 / 0)Exception e:
print()
:
print()
:
print()
#得到 我是try...
我是except...
我是finally...
#如果吧print(10 / 0) 改为print(10 / 2)
#得到 我是try...
5.0
我是else...
我是finally...age = 18
age < 0 age > 130:
:
Exception()
:
print()
:
print(%age)print('能走吗?')
#得到结果为 年龄为:18
能走吗?
#如果第一行是age=-18,则
#得到结果为 年龄不合法...正在处理
能走吗?
m1():
print()
print(10 / 0)
m2():
print()
m1()
m3():
print()
:
m2()
:
m3()
#得到结果 我是m3...
我是m2...
我是m1...