异常和错误
try中的代码
一旦在一个地方发生错误
后面的代码就不执行了
会直接跳到except的位置
一个错误类型只能处理一种错误
出现异常之后#比如上面的例子出现indexerror错误,会先执行到valueerror,在往下找
会从上到下去执行except中的error
一旦匹配上就会执行except中的代码
执行完之后不再执行其他except
l =[1,2,3,4] try: num = int(input('num:')) print(l[num]) except ValueError: print('请输入一个数字') except IndexError: print('输入的数字超出范围')
万能异常
l =[1,2,3,4] try: num = int(input('num:')) print(l[num]) except: #如果不写 所有的错误都能处理 print('万能的异常') #另一种写法 l =[1,2,3,4] try: num = int(input('num:')) print(l[num]) except Exception: #万能异常 print('万能的异常')
但是万能异常有个缺陷,就是没有办法打印出到底是什么错误,那怎么解决
l =[1,2,3,4] try: num = int(input('num:')) print(l[num]) except Exception as e: #万能异常,能打印出错误原因'e'可以是任意字符,习惯用法 print(e) #那么万能异常 怎么使用 #有多个except的时候,万能异常永远发在最后 l =[1,2,3,4] try: num = int(input('num:')) print(l[num]) except ValueError: print('请输入一个数字') except IndexError: print('输入的数字超出范围') except Exception as e:#在最后位置 print(e)
else中的代码 在try中的代码全部顺利执行之后才执行
如果try中的代码出现错误,那么else就不执行
什么时候用呢?
在代码顺利执行的时候,报成功或者报结果的时候使用的
try except格式
try except else格式 else必须放在最后
try except else finally格式
try finally格式
finally:不管代码是否出错,都是一个无论如何会执行的代码
l =[1,2,3,4] try: num = int(input('num:')) print(l[num]) except ValueError: print('请输入一个数字') except IndexError: print('输入的数字超出范围') else: print('执行我了') finally: print('最后执行')
finally
finally:不管代码是否出错,都是一个无论如何会执行的代码 打开的操作系统的资源不管代码执行是否出错,都应该归还 所以这样的代码就应该写在finally中 def func(): try: f = open('file','w') content = f.read() return content #在这执行完后,要返回,就不会归还资源 finally: f.close() #在这里归还资源,无论怎样 都执行finally
主动抛出异常
#主动的抛出一个异常 raise TypeError#会报错 但在这里没有提示 raise TypeError('出现了不可思议的TypeError') raise ValueError('出现了不可思议的TypeError')
assert断言
#像当于一个条件判断,满足条件通过,不满足报错 assert 1 == 2 print('qwe')
自定义异常
class EvaException(BaseException): #必须继承baseexcepyion def __init__(self,msg): self.msg = msg def __str__(self): 这个方法可以省略,在父类里面有这个方法 return self.msg eva = EvaException('类型错误') #就是实例化一个对象 print(eva)
class EvaException(BaseException): #必须继承baseexcepyion def __init__(self,msg): self.msg = msg def __str__(self): return self.msg try: raise EvaException('类型错误') except EvaException as e:#这里边的'e'就是一个类EvaException的对象 就是一个实例化的过程 print(e)