- 异常(高级)
回顾异常相关的语句:
try - except 用来捕获异常通知
try - finally 用来做一定要做的事情
raise 用来发出异常通知
assert 用来根据条件来发出AssertionErorr类型的异常通知
- with语句
语法:
with 表达式1 [as 变量1], 表达式2 [as 变量2]:
语句块
- 作用:
使用于对资源进行访问的场合,确保使用过程中不管是否发生异常,都会执行必须的’清理’操作,并释放资源
如:文件使用后自动关闭,线程中锁的自动获取和释放等
示例1:
#此示例示意try-except和try-finally组合对文件进行操作
def read_from_file(filename = 'info.txt'):
try: #处理文件打开异常
f = open(filename)
try: #处理文件操作异常
print('正在读取文件')
n = int(f.read())
print('n =',n)
finally:
f.close()
print('文件已经关闭')
except OSError:
print('文件打开失败')
示例2:
#此示例示意用太try-except和with语句组合来进行文件的操作
def read_from_file(filename = 'info.txt'):
try: #处理文件打开异常
with open(filename) as f: #with语句自动关闭文件
print('正在读取文件') #with用于资源访问场合
n = int(f.read())
print('n =',n)
print('文件已经关闭')
except OSError:
print('文件打开失败')
- 说明:能够用于with语句进行管理的对象必须是环境管理器
- 环境管理器
(1)类内有__enter__和__exit__实例方法的类被称为环境管理器
(2)能够用with语句管理的对象必须是环境管理器
(3)__enter__方法将在进入with语句时被调用,并返回由as变量管理的对象
(4)__exit__将在离开with语句时被调用,且可以用参数来判断在离开with语句时是否有异常发生并作出相应的处理
示例:
#此示例示意环境管理器的定义和使用
class A:
def __enter__(self):
print('已进入with语句')
return self #返回的对象将由as绑定
def __exit__(self,exc_type,exc_val,exc_tb):
'''此方法会在退出with语句时自动调用
exc_type 在没有异常时为None,出现异常时为异常类型
exc_val 在没有异常时为None,出现异常绑定错误对象
exc_tb 在没有异常时为None,出现异常绑定reaceback
'''
if exc_type == None:
print('已离开with语句,离开时状态正常')
else:
print('已离开with语句,离开时状态异常')
print('异常类型是:',exc_type)
print('错误对象是:',exc_val)
print('traceback是:',exc_tb)
with A() as a:
print('这是with语句内的一条语句')
#这里若发生异常仍回调用exit语句
num = int(input('请输入一个整数:'))