Python异常处理

  1. 常见异常
    AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
    IOError 输入/输出异常;基本上是无法打开文件
    ImportError 无法引入模块或包;基本上是路径问题或名称错误
    IndentationError 语法错误(的子类) ;代码没有正确对齐
    IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
    KeyError 试图访问字典里不存在的键
    KeyboardInterrupt Ctrl+C被按下
    NameError 使用一个还未被赋予对象的变量
    SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
    TypeError 传入对象类型与要求的不符合
    UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
    导致你以为正在访问它
    ValueError 传入一个调用者不期望的值,即使值的类型是正确的
  2. 异常的分类:
  • 基本结构:
    try:
         被检测的代码块
    except 异常类型:
         try中一旦检测到异常,就执行这个位置的逻辑

     

  • 单分支结构:
    #单分支只能用来处理指定的异常情况,如果未捕获到异常,则报错
    try:
        a
    except NameError as e:  #我们可以使用except与as+变量名 搭配使用,打印变量名会直接输出报错信息
        print(e)   #name 'a' is not defined

     

  • 多分支结构·:
    l1 = [('电脑',16998),('鼠标',59),('手机',8998)]
    while 1:
        for key,value in enumerate(l1,1):
            print(key,value[0])
        try:
            num = input('>>>')
            price = l1[int(num)-1][1]
        except ValueError:
            print('请输入一个数字')
        except IndexError:
            print('请输入一个有效数字')
    #这样通过异常处理可以使得代码更人性化,用户体验感更好。

     

  • 万能异常处理类:
    在python的异常中,有一个万能异常:Exception,他可以捕获任意异常。它是一把双刃剑,有利有弊,我们要视情况使用
    
      如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么只有一个Exception就足够了。
    
      如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。我们可以使用多分支+万能异常来处理异常。使用多分支优先处理一些能预料到的错误类型,一些预料不到的错误类型应该被最终的万能异常捕获。需要注意的是,万能异常一定要放在最后,否则就没有意义了。
    
    part5:try...else语句

     

  • try else语句:
    try:
        for i in range(10):
            int(i)
    except IndexError as e:
        print(e)
    else:
        print('***********')   #***********   执行了此处
        #当try语句中的代码没有异常,被完整地执行完,就执行else中的代码

     

  • try finally 语句:
    def dealwith_file():
        try:
            f = open('file',encoding='utf-8')
            for line in f:
                int(line)
            return True
        except Exception as e:
            print(e)
            return False
        finally:
            '''不管try语句中的代码是否报错,都会执行finally分支中的代码'''
            '''去完成一些连接操作的收尾工作'''
            print('finally 被执行了')
            f.close()
    ret = dealwith_file()
    print(ret)

     

  • 还可以自定义默认异常处理类

posted on 2019-09-10 14:39  ybl20000418  阅读(101)  评论(0编辑  收藏  举报

导航