raise语句
raise语句可以显式的触发异常,基本格式如下:
raise [Exception [,args]]
语句中Exception是异常的类型,args是一个异常参数值。该参数是可选的,如果不提供,异常的参数是"None"
使用类名引发异常
当raise语句指定异常的类名时,系统会创建该类的实例对象,然后引发异常。语法格式如下:
raise 异常类 #引发异常时会隐式的创建类对象
示例如下:
raise TypeError
程序运行结果如下:
Traceback (most recent call last):
File "C:/Python学习/第九章/异常.py/,line 1,in <module>
raise TypeError
TypeError
使用异常类对象引发异常
通过显式的创建异常类的实例,直接使用该实例对象引发异常。这种方式较为常见。
语法格式如下:
raise 异常类对象 #引发异常类实例对象对应的异常
type=TypeError
raise type
Traceback (most recent call last):
File "C:/Python学习/第九章/异常.py/,line 2,in <module>
raise type
TypeError
重新引发刚刚发生的异常
指定异常的描述信息
异常引发异常
assert语句
assert语句又称断言,常用在程序的某个位置以确认指定条件是否已满足,常和异常处理结构一起使用。断言语句assert仅当脚本__debug__属性值为True时有效,一般只在开发和测试阶段使用。当python程序编译成字节码文件时,assert语句将会被删除。
当不满足用户定义的约束条件时,它会触发AssertionError异常,所以assert语句可以当作条件式的raise语句。
assert语句的语法格式如下:
assert 逻辑表达式,data
data是可选的,通常为一个字符串。当表达式的结果为False时,作为异常类型的描述信息使用。
age=5
assert age>=6,'没有达到入学年龄!'
程序运行结果如下:
Traceback (most recent call last):
File "D:\桌面\新建文件夹\测试.py", line 2, in <module>
assert age >= 6,'没有达到入学年龄!'
AssertionError: 没有达到入学年龄!
with语句
在python中,提供了with语句用于简化资源操作的后续清除操作,是try/finally的替代方法,而它的实现是建立在上下文管理器的前提之上。
上下文管理器
若使用with语句,前提就是要有上下文管理器。
1.上下文管理协议
包含方法__enter__()和__exit__(),支持该协议的对象要实现这两个方法。
(1)enter(self):进入上下文管理器时调用此方法,其返回值将被放入with-as语句中的as说明符指定的变量中。
(2)exit(self,type,value,tb):离开上下文管理器调用此方法。如果有异常出现,type、value、tb分别为异常的类型、值、追踪信息;如果没有异常出现,3个参数均为none,此方法返回true或者false,分别指示被引发的异常是否得到处理,如果返回false,引发的异常会被传递出上下文。
2.上下文管理器
支持上下文管理协议的对象,这种对象实现了__enter__()和__exit__()两种方法。上下文管理器定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。
3.运行时上下文
4.上下文表达式
5.语句体
with语句
with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的"清理"操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
不管文件操作是否出现异常,try/finally中的finally语句都会被执行,从而保证文件的正确关闭。而with语句的出现以更简洁、更优美的形式来实现资源的清理,且这种清理工作并未暴露给使用者。
with语句的基本语法结构如下:
with expression [as variable]:
with-block
上述语法格式的含义如下:
(1)上下文表达式(expression)。返回一个上下文管理器对象。若指定了as子句,则该对象并不赋值给资源对象,而是将上下文管理器的_enter_()方法的返回值赋值给资源对象。
(2)资源对象(as variable)。可以是单个变量,可以是元组。
(3)对象的操作(with-block)。with语句包裹的代码块。在执行该代码块之前,会调用上下文管理器的_enter_()方法;在执行代码块之后,会执行_exit_()方法。
示例代码如下:
with open("text.txt") as f:
for line in f.readlines()
print(line)
使用with语句相对try/finally较为简洁,且不需要每一个用户均写入f.close()关闭文件。with语句的expression是上下文管理器。with语句中的[as variable]是可选的,如果已指定as variable说明符,则variable是上下文管理器expression调用__enter__()函数返回的对象。所以,f并不一定就是expression,也可能是expression.enter()的返回值。至于expression.enter()返回内容由此函数决定。with-block是执行语句,with-block执行完毕时,with语句会自动进行资源清理。
with语句的整个执行过程,具体如下:
(1)首先执行上下文表达式,生成一个上下文管理器对象。
(2)接着,调用上下文管理器的_ernter_方法,如果使用了as子句,就把_enter_()方法的返回值赋值给as子句中的资源对象。
(3)然后,执行with语句包裹的代码块。
(4)无论在执行的过程中是否发生异常,都会执行上下文管理器的_exit_()方法。该方法负责执行程序的“清理”工作,如释放资源等。
(5)如果执行过程中没有出现异常,或者代码块中执行了break、continue或者return语句,则以none作为参数调用_exit_()方法,如果在执行过程中出现异常,则会使用sys.exc_info得到的异常信息为参数调用_exit_()方法。
(6)出现异常时,如果_exit_()方法返回的结果为false,则会重新抛出异常,让with之外的语句逻辑来处理异常,这是通用做法,如果返回true,则忽略异常,不再对异常进行处理。