• 【Python】异常处理


    下面看一个简单例子:

    data = {}
    
    try:
        data["name"]
    except KeyError as e:   #e是错误的相信信息,错误的原因
        print("没有这个key",e)
    运行结果如下:
    没有这个key 'name'

        从上面结果可以看出,当出现错误的时候,我们可以使用try.....except来规避错误,不让程序报错。能够继续运行。其中as e是错误的明细,原因。

        多种错误扑捉的方法:(1)

    data = {}
    
    try:
        data["name"]
    except KeyError as e:   #e是错误的相信信息,错误的原因
        print("没有这个key",e)
    except IndexError as e:
        print("列表索引错误",e)

        多种错误扑捉方法:(2)   

    data = {}
    names = []
    try:
        names[1]
    except (IndexError,KeyError) as e:   #e是错误的相信信息,错误的原因
        print("列表索引错误",e)

        把多种错误原因放到元素中,自动查找术语那种错误。

        Exception抓取基本上所有的错误,一般情况下不建议使用,使用的话放在最后,上面的错误都抓取不到的时候,就最后抓取一次。

    异常

        try:

        code

      except (Error1,Error2) as e:

        print(e)

        except Exception:抓取所有错误,一般不建议使用,使用放在最后一次抓取上。如下:

    data = {}
    names = []
    num = 1
    try:
        num/0
    except (IndexError,KeyError) as e:   #e是错误的相信信息,错误的原因
        print("列表索引错误",e)
    
    except FileNotFoundError as e:
        print("文件不存在",e)
    
    except Exception as e:
        print("未知错误",e)
    运行结果如下:
    未知错误 division by zero

        上面代码中,except Exception就是用来处理上面所有的情况都抓取不到错误的时候执行的。经常就是所有努力都失败了才执行。

        下面来看一下单元测试,我们经常会测试代码,如果出错了执行错误,如果没有出错,告诉我们没有问题,如下,代码测试:

    data = {}
    names = []
    num = 1
    try:
        num/0
    except (IndexError,KeyError) as e:   #e是错误的相信信息,错误的原因
        print("列表索引错误",e)
    
    except FileNotFoundError as e:
        print("文件不存在",e)
    
    except Exception as e:
        print("未知错误",e)
    
    else:
        print("一切OK")
    运行结果如下:
    未知错误 division by zero

        上面代码中,我们知道1/0肯定是会报错的,因为会执行最后一个错误。但是else语句会执行吗?可以从运行结果看没有执行,那么我们来看下正确的情况下:

    data = {}
    names = []
    num = 1
    try:
        num/1
    except (IndexError,KeyError) as e:   #e是错误的相信信息,错误的原因
        print("列表索引错误",e)
    
    except FileNotFoundError as e:
        print("文件不存在",e)
    
    except Exception as e:
        print("未知错误",e)
    
    else:
        print("一切OK")
    运行结果如下:
    一切OK

        从代码的运行结果可以看出,当没有错误的时候,执行了else语句,由此我们可以看出,当程序执行遇到错误的时候执行错误,不会执行else语句,当程序运行正常的时候,会执行else语句,告诉我们程序没有出现异常错误。这种情况常用在测试上,错误返回错误,正常返回正常。

        下面来看下无论是否出错都执行的,finally:

        没有异常的时候:

    data = {}
    names = []
    num = 1
    try:
        num/1
    except (IndexError,KeyError) as e:   #e是错误的相信信息,错误的原因
        print("列表索引错误",e)
    
    except FileNotFoundError as e:
        print("文件不存在",e)
    
    except Exception as e:
        print("未知错误",e)
    
    else:
        print("一切OK")
    
    finally:
        print("不管有没有错,都执行!!!")
    运行结果如下:
    一切OK
    不管有没有错,都执行!!!

        上面可以看出,代码没有异常的时候执行了finally语句。

        下面来看下,代码正常的时候的情况:

    data = {}
    names = []
    num = 1
    try:
        num/0
    except (IndexError,KeyError) as e:   #e是错误的相信信息,错误的原因
        print("列表索引错误",e)
    
    except FileNotFoundError as e:
        print("文件不存在",e)
    
    except Exception as e:
        print("未知错误",e)
    
    else:
        print("一切OK")
    
    finally:
        print("不管有没有错,都执行!!!")
    运行结果如下:
    未知错误 division by zero
    不管有没有错,都执行!!!

        从上面运行结果可以看出,当错误的时候,else语句没有执行,但是finally语句继续执行。说明无论什么样的情况下,finally语句都会正常执行。

        python中的异常种类非常多,每个异常专门用于处理某一项异常!!!

        AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x

        IOError 输入/输出异常;基本上是无法打开文件

        ImportError 无法引入模块或包;基本上是路径问题或名称错误

        IndentationError 语法错误(的子类) ;代码没有正确对齐

        IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

        KeyError 试图访问字典里不存在的键

        KeyboardInterrupt Ctrl+C被按下

        NameError 使用一个还未被赋予对象的变量

        SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)

        TypeError 传入对象类型与要求的不符合

        UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它

        ValueError 传入一个调用者不期望的值,即使值的类型是正确的

        自定义异常:

        我们在连接数据库的时候,如果连接错误,会出现异常,这种异常Python自带的异常是抓取不到的,因此只能自己抓取。这个时候就需要自定义异常。如下:

    class MysqlConnectError(Exception):
        def __init__(self, msg):
            self.message = msg
    
        def __str__(self):
            return self.message
    try:
        raise MysqlConnectError('我的异常')
    except MysqlConnectError as e:
        print(e)
    运行结果如下:
    我的异常

        上面就是自己定义的异常处理情况。

    总结如下

    1. except语句不是必须的,finally语句也不是必须的,但是二者必须要有一个,否则就没有try的意义了。

    2. except语句可以有多个,Python会按except语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的except语句。

    3. except语句可以以元组形式同时指定多个异常,参见实例代码。

    4. except语句后面如果不指定异常类型,则默认捕获所有异常,你可以通过logging或者sys模块获取当前异常。

    5. 如果要捕获异常后要重复抛出,请使用raise,后面不要带任何参数或信息。

    6. 不建议捕获并抛出同一个异常,请考虑重构你的代码。

    7. 不建议在不清楚逻辑的情况下捕获所有异常,有可能你隐藏了很严重的问题。

    8. 尽量使用内置的异常处理语句来 替换try/except语句,比如with语句,getattr()方法。

  • 相关阅读:
    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用
    jQuery UI组件库Kendo UI使用技巧小分享
    Kendo UI ListView模板功能,让Web开发更轻松
    UI组件套包DevExpress ASP.NET Core v20.2新版亮点:全新的查询生成器
    Devexpress WinForms最新版开发.NET环境配置Visual Studo和SQL Server对应版本
    全新的桌面应用数据可视化呈现方式,Sankey Diagram控件你了解多少?
    java中的递归方法
    连接数据库查询 将查询结果写入exce文件中
    java连接mysql数据查询数据
  • 原文地址:https://www.cnblogs.com/yanglang/p/7263561.html
Copyright © 2020-2023  润新知