1.程序在异常抛出的地方中断执行,如果不捕获,就会提前结束程序 raise语句 raise后什么都没有,表示抛出最近一个被激活的异常,如果没有被激活的异常,则抛类型异常 raise后要求应该是BaseException类的子类或者实例,如果是类,将被无参实例化
BaseException是所有内建异常类的基类
#sys.exit()函数引发的异常,如果异常不捕获处理,就直接交给python解释器,解释器直接退出 import sys try: sys.exit(1) except SystemExit: print('exit') print('outer')
Exception及其子类
exception是所有内建的,非系统退出的异常的基类,自定义异常应该继承自它 SyntaxError语法错误,Python将这种错误也归到异常类下面的exception子类,但是这种错误是不可捕获的
ArithmeticError
所有算数计算引发的异常,其子类有除零异常等
LookupError
使用映射的键或者序列的缩影无效是引发的异常的基类:IndexError,KeyError
自定义异常
从exception继承得类
捕获原则,从小到大,从具体到宽泛,捕获不到就向外抛出异常,如果被一个exception语句捕获,其他的就不会在捕获异常了
as子句
被抛出的异常应该是异常的实例,使用as子句去获得这个对象
class Myexception(Exception): def __init__(self,code,message): self.code = code self.message = message try: raise Myexception('400','error') except Myexception as e: print('{}-->{}'.format(e.code,e.message))
finally子句
finally最终,即最后一定会执行的,try。。。finally语句中不管是否发生了异常都要执行finally
open函数打开文件失败就不会赋值给f ,如果不给f=None 判断f 还会抛出error f = None try: f = open('abcdefg') except Exception as e: print('{}'.format(e)) finally: print("clean workstation") if f: f.close() # f.close()
try的工作原理
1.如果try中语句执行时发生异常,搜索except子句,并执行第一个匹配该异常的except子句 2.如果try中语句执行发生异常,却没有匹配的except子句,异常将被递交到外层try,还不处理,继续抛出,还不处理终止异常所在的线程 3.如果在try执行时没有发生异常,将会执行else子句中的语句 4.无论try中是否发生异常,finally子句都会执行