抛出异常和with语句

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,则忽略异常,不再对异常进行处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值