一、什么是异常
1、定义:
异常就是程序运行发生错误,在程序出现错误是,则会产生一个异常,若程序没有处理它,则会抛出异常,程序也会随之终止
2、一个异常分为三部分:
异常的追踪信息
异常的类型
异常的值
二、异常的种类
1、语法异常
这类异常应该在程序执行前就改正
2、逻辑异常
#索引错误 # IndexError # l=['a','b'] # l[100] #字典的索引key值出现错误 # KeyError # d={'a':1} # d['b'] #自定义类,以及引入模块属性错误 # AttributeError: # class Foo: # pass # # Foo.x # import os # os.aaa #分割出现错误,零不能做分母 # ZeroDivisionError # 1 / 0 #打开文件不存在错误 # FileNotFoundError # f=open('a.txt','r',encoding='utf-8') #打开文件出现错误,程序抛出异常,终止程序,文件不能关闭,占用系统资源 # ValueError: I/O operation on closed file. # f=open('a.txt','r',encoding='utf-8') # f.close() # f.readline() #值错误,int类型不能是字符串 #ValueError: invalid literal for int() with base 10: 'aaaaa' # int('aaaaa') #类型错误 # TypeError # for i in 333: # pass #名字错误,无定义 #NameError # x # func() # def func(): # import os # os.xxxx # # func()
三、异常的处理
# 语法: # 单分支 # 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: # print('万能异常---》') # # # print('other.....') # 获取异常的值,通过as赋值给变量e,通过打印就能看到返回结果 # 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.....') # 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 KeyError as e: # print('KeyError: ',e) # # except Exception as e: # print('万能异常---》',e) # # # print('other.....') # try....else... # else: 不能单独使用,必须与except连用,意思是:else的子代码块会在被检测的代码没有出现过任何异常的情况下执行 # 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 KeyError as e: # print('KeyError: ',e) # # except Exception as e: # print('万能异常---》',e) # # else: #万能模板执行就不会执行else的内容,except类似于elif语句,一个成立,就不会执行其他的条件 # print('在被检测的代码块没有出现任何异常的情况下执行') # print('other.....') # try...finally....#无论有没有发生异常都会被执行 # 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 KeyError as e: # print('KeyError: ',e) # # except Exception as e: # print('万能异常---》',e) # # else: # print('在被检测的代码块没有出现任何异常的情况下执行') # finally: # print('无论有没有异常发生,都会执行') # print('other.....') # finally的子代码块中通常放回收系统资源的代码 # try: # f=open('a.txt',mode='w',encoding='utf-8') # f.readline() # # finally: # f.close() #有没有异常都会被执行,放回收资源的代码块,即使有异常文件也会被关闭 # # print('other....') # 主动触发异常,条件不成立使用raise TypeError主动触发异常 # raise TypeError('类型错误') # class People: # def __init__(self,name): # if not isinstance(name,str): # raise TypeError('%s 必须是str类型' %name) # # self.name=name # # p=People('egon') # 断言 print('part1........') stus=['egon','alex','wxx','lxx'] # stus=[] # # if len(stus) <= 0: # raise TypeError #TypeError后面内容可以没有 assert len(stus) > 0 #条件满足则断言生效,生效一次 # # print('part2.........') # print('part2.........') # print('part2.........') # print('part2.........') # print('part2.........') # print('part2.........') # 自定义异常 # 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') # # age=input('>>: ').strip() #age='aaa' # # if age.isdigit(): # age=int(age) # # if age > 10: # print('too big') # elif age < 10: # print('too small') # else: # print('you got it')
四、什么时候用异常