异常处理:
一、什么是异常
1.异常是错误发出的信号
程序一旦出错,如果程序中还没有相应的处理机制
那么该错误就会产生一个异常抛出来
程序的运行也随之终止
2.一个异常分为三部分:
1.异常的追踪
2.异常的类型
3.异常的值
3.异常的分类:
1.语法异常:(这种错误,根本过不了python解释器的语法检测)
这类异常应该在程序执行前就改正 print('start.......') x=1 x+=1 if print('stop.....')
2.逻辑上的异常:
IndexError: #IndexError: list index out of range l=['a','b'] l[3] KeyError: #KeyError: 'b' d={'a':1} d['b'] AttributeError: #AttributeError: type object 'Foo' has no attribute 'x' class Foo: pass Foo.x ValueError: #ValueError: I/O operation on closed file f=open('a.txt','r',encoding='utf-8') f.close() f.readline() ValueError: # invalid literal for int() with base 10: 'aaaaa' int('aaaa') TypeError: #'int' object is not iterable for i in 333: pass NameError: #name 'x' is not defined x ZeroDivisionError: #division by zero 1/0
二、异常处理
为了保证程序在遇到错误时不会崩溃,我们需要对异常进行处理。
1.如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防
while True: age=input('输入').strip() if age>18: print('猜大了') elif age<18: print('猜小了') eles: print('猜对了') break
2.如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理
#单分支 try: print('start.....') x=1 y l=[] l[3] d={'a':1} d['b'] print('end....') except NameError: print('变量名没有定义') print('other.....') #多分支 try: print('start.....') x=1 # y l=[] l[3] d={'a':1} d['b'] print('end....') except NameError: print('变量名没有定义') except KeyError: print('字典的key不存在') except IndexError: print('索引超出列表的范围') print('other.....') #多种异常采用同一段逻辑处理 try: print('start.....') x=1 # y l=[] # l[3] d={'a':1} d['b'] print('end....') except (NameError,KeyError,IndexError): print('变量名或者字典的key或者列表的索引有问题') print('other......') #万能异常: #获取异常的值 try: print('start.....') x=1 y l=[] l[3] d={'a':1} d['b'] import os os.aaa print('end....') except Exception as e: print('万能异常---》',e) print('other.....')
3.try...else...
else:不能单独使用,必须与except连用,意思是:else的子代码块会在被检测的代码没有出现过任何异常的情况下执行
4.try...finally...
finally:无论有没有异常发生,都会执行,finally的子代码块中通常放回收系统资源的代码
#1、 try: print('start.....') x=1 y l=[] l[3] d={'a':1} d['b'] import os os.aaa print('end....') except NameError as e: print('NameError: ',e) except Exception as e: print('万能异常---》',e) else: print('在被检测的代码块没有出现任何异常的情况下执行') finally: print('无论有没有异常发生,都会执行') print('other.....') #2、 try: f=open('a.txt',mode='w',encoding='utf-8') f.readline() finally: f.close() #回收系统资源 print('other....')
5.自动触发异常
raise TypeError('类型错误') class People: def __init__(self,name): if not isinstance(name,str): raise TypeError('%s 必须是str类型' %name) self.name=name p=People(123)
6.断言
print('part1....') stus=['gao','egon','wxx'] assert len(stus) >0 print('part2......')
7.自定义异常:并不是所有的功能都要自己写,可以用继承,(BaseException):所有异常的基类
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')
三、什么时候用异常处理
首先try...except是你附加给你的程序的一种异常处理的逻辑,与你的主要的工作是没有关系的,这种东西加的多了,会导致你的代码可读性变差。
异常处理只有在错误发生的条件无法预知的情况下,才应该它。
异常处理能不用就别用。