python-异常处理

异常和错误

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)

 

原文地址:https://www.cnblogs.com/xiao-xuan-feng/p/12374105.html