一、什么是异常
异常是错误发生的信号。程序一旦出错,如果程序中没有相应的处理机制,那么该错误就会产生一个异常抛出来,程序也随之终止
一个异常分为三部分:
1、是异常的:追踪信息
2、是异常的:类型(类)
3、是异常的:值
二、异常分类
1、语法异常:
这类异常应该在程序执行前就应该改正
2、逻辑上的异常:
(常见常用的如下)
IndexError(超出索引范围)
KeyError(字典里不存在这个键)
AttributeError(访问一个对象的属性,但这个对象却没有这个属性。产生属性异常)
IOError(输入\输出异常,一般是打不开文件)
ZeroDivisionError(如1/0)
FileNotFoundError(文件不存在)
TyepError(传入的对象类型与要求的不符合)
NameError(使用一个未被赋值的变量)
ValueError(传入一个调用者不期望的值,即使传入的值的类型没问题)
三、异常处理
try: print('start.....') a l=['a','b'] l[6] d={'a':1} d['b'] print('end......') except NameError: print('变量没有定义') except IndexError: print('索引超出范围') except KeyError: print('字典的key不存在') print('other')
结果为:
上面的异常也可以用下图中的一个逻辑来粗略的处理
还有用一个粗略处理异常是万能异常(Exception)
用万能异常处理是不知道具体是异常的名字,但我们已经了解异常分为三部分,我们可以把这个异常的值,赋值给一个变量来判断它什么异常。
try: print('start....') import os os.aaa a l=['a','b'] l[6] d={'a':1} d['b'] print('end......') except Exception as e : print('万能异常---》',e) print('other....')
结果为:
这时我们就可以通过得到的异常的值,就可以推断出它是一个AttributeError。
也可以单独的拿出一种异常来处理,其它的异常做粗略处理。:
try...excpt....else....finally处理异常的用法:
else:必须与except连用,意思是:else里的代码块在没有异常的情况下会被执行。
finally:无论有没有异常,finally代码块都会执行!!!
看下面的代码就要用到finally来回收资源的问题,
try: f=open('a.txt',mode='w',encoding='utf-8') f.readline() f.close() except Exception as e: print(e)上面的代码读代码出现了异常,但是文件已经打开了,抛出异常后就没有将文件给关闭,所以我们就要让它不管有没有异常执行完后都要关闭文件资源。
所以上面的代码要进行一个修改如下:
try: f=open('a.txt',mode='w',encoding='utf-8') f.readline() except Exception as e: print(e) finally: f.close()
主动触发异常:
class People: def __init__(self,name): self.name=name if not isinstance(name,str): raise TypeError('%s 必须是str类型'%name) self.name=name p=People(123)
结果显示为:
四、断言
五、自定义异常
class RegisterError(BaseException): def __init__(self,msg,user): self.msg=msg self.user=user def __str__(self): return '<%s,%s>'%(self.user,self.msg) # raise RegisterError('注册失败','teacher') obj=RegisterError('注册失败','teacher') print(obj)
最后我们什么时候用异常处理呢!!!
当错误的条件是可以预知的,就不要弄异常处理用if条件判断在发生错误前进行预防。但有很多的异常我们不能预测,所以就要捕获异常处理。
总结:
捕获异常(try...execpt),它把错误处理和真正要运行的代码分开、代码更有组织结构,代码运行更加安全,不会因一些小错误而导致崩溃。