异常
异常就是错误发生的信号,一旦程序出错,并且程序没有处理这个错误,那就会抛出异常,并且程序的运行随之终止
1.异常的三个部分
- Traceback 异常的追踪信息
- ValueError 异常的类型
- 异常的值
2.异常的错误类型
语法错误:int('aaa') # ValueError: invalid literal for int() with base 10: 'aaa'
逻辑错误: for i in 3:print(i) #TypeError: 'int' object is not iterable
3.异常的强调
强调一: 对于错误发生的条件是可以预知的,此时应该用if判断去预防异常
AGE=10 age = input('>>:').strip() if age.isdigit(): #通过isdigit方法可以让用户在输入非int类型的时候,不让程序崩溃,进而出现异常 age=int(age) if age > AGE: print('太大了')
强调二: 对于错误发生的条件是不可预知的,此时应该用异常处理机制,try...exceot
- 程序报错后,不会崩溃,会继续执行下面的代码
- 异常类只能对指定的异常进行处理,对于非指定的异常则无法处理
try: f = open('a.txt','r',encoding='utf-8') print(next(f),end='') print(next(f),end='') print(next(f),end='') print(next(f),end='') print(next(f),end='') f.close() except StopIteration: print('出错了') print('>>>1') print('>>>2')
4.异常的分类
1.多分支:被监测的代码块抛出的异常有多种可能性,并且我们需要针对每一种异常类型,都定制专门的处理逻辑
2.万能异常: Exception,被监测的代码块抛出的异常有多种可能性,并且我们需要针对所有异常类型,都只有一种的处理逻辑
3.主动出发异常: raise 异常类型(值) 例如:raise TypeError('age必须为int')
4.自定义异常类型
5.断言assert: 未被检测的代码,要依靠被检测代码实行的结果,用到assert
5.异常的种类
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
# 只有在错误一定会发生,无法预知他发生的条件,不能让程序因此崩溃掉 #多分支:被监测的代码块抛出的异常有多种可能性,并且我们需要针对每一种异常类型,都定制专门的处理逻辑 # try: # print('===>1') # # name # print('===>2') # l=[1,2,3] # # l[100] # print('===>3') # d={} # d['name'] # print('===>4') # # except NameError as e: # print('----->',e) # #-----> name 'name' is not defined # # except IndexError as e: # print('----->',e) # #-----> list index out of range # # except KeyError as e: # print('----->',e) # #-----> 'name' #万能异常: Exception,被监测的代码块抛出的异常有多种可能性, # 并且我们针对所有的异常类型,都只用一种的处理逻辑 # try: # print('===>1') # name # print('===>2') # l=[1,2,3] # l[100] # print('===>3') # d={} # d['name'] # print('===>4') # # except Exception as e: # print('异常发生:',e) # try: # print('===>1') # # name # print('===>2') # l=[1,2,3] # # l[100] # print('===>3') # d={} # d['name'] # print('===>4') # # except NameError as e: # print('----->',e) # # except IndexError as e: # print('----->',e) # # except KeyError as e: # print('----->',e) # # except Exception as e: # print('统一的处理方法:',e) #其他结构 # try: # print('===>1') # # name # print('===>2') # l=[1,2,3] # # l[100] # print('===>3') # d={} # d['name'] # print('===>4') # # except NameError as e: # print('----->',e) # # except IndexError as e: # print('----->',e) # # except KeyError as e: # print('----->',e) # # except Exception as e: # print('统一的处理方法:',e) # # else: # print('在被检测代码块没有发生异常时执行') # # finally: # print('不管被检测代码块有无发生异常都会执行') #当涉及到资源回收的时候 # try: # f=open('a.txt','r',encoding='utf-8') # print(next(f)) # print(next(f)) # print(next(f)) # print(next(f)) # # print(next(f)) # finally: # f.close() #主动出发异常: raise 异常类型(值) # class People: # def __init__(self,name,age): # if not isinstance(name,str): # raise TypeError('名字必须传入str类型') # if not isinstance(age,int): # raise TypeError('年龄必须传入int类型') # # self.name=name # self.age=age # # p=People('yang',18) #自定义异常类型 class MyException(BaseException): def __init__(self,msg): super(MyException,self).__init__() self.msg=msg def __str__(self): return ('<%s>' %self.msg) raise MyException('自己的异常类型') #断言assert # info={} # info['name']='yang' # info['age']=18 # if 'name' not in info: # raise KeyError('必须有name这个key') # # if 'age' not in info: # raise KeyError('必须有age这个key') # assert ('name' in info) and ('age' in info) # # if info['name'] == 'yang' and info['age'] > 10: # print('welcome')