'''
try/except
捕捉引起的异常并恢复
try/finally
无论异常是否发生,都执行
raise
手动触发异常
assert
有条件的在畅叙代码中触发异常
with/as
实现环境管理器
'''
try:
a = 1
assert a ,'有条件引发异常'
except KeyError as e :
print(e)
else:
print('ok')
class Bad(Exception):
print('用户自定义异常')
try:
q=1
raise Bad()
except Bad:
print('捕获自定义异常')
finally:
print('finally ...')
'''
with语句实际工作方式
计算表达式
所得到的对象称为环境管理器,必须__enter__和__exit__方法
环境管理器的__enter__方法会被调用,as存在,
返回值会赋值给as中的变量,
代码块中嵌套的代码会执行
with代码发生异常
__exit__方法就会被调用,带有异常的细节
此方法返回值为假,异常会重新引发,否则异常终止
with没有引发异常,__exit__方法依然调用
'''
print('------4--------')
class TraceBlock:
def message(self,arg):
print('runing ',arg)
def __enter__(self):
print('starting with block')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is None:
print('exited normally\n')
else:
print('raise an exception ', exc_type)
return False
with TraceBlock() as action:
action.message('test 1')
print('reached')
with TraceBlock() as action:
action.message('test 2')
raise TypeError
print('not reached')
'''
基于类的异常
提供类型分类,对以后的修改有更好的支持
附加状态信息
支持继承
BaseException 顶级类
Exception 顶级类的直接子类
ArithmeticError 数值错误了的超类
'''
'''
try嵌套
try运行时将try语句放入堆栈
异常发生时
会回到最近进入、具有相符except分句的try语句
错误时异常
异常不都是错误
raise定义的异常也不是错误
'''

