博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day7异常处理
阅读量:6818 次
发布时间:2019-06-26

本文共 3704 字,大约阅读时间需要 12 分钟。

异常处理

下面看一个简单例子:

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 = 1try:    num/0except (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 = 1try:    num/0except (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 = 1try:    num/1except (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 = 1try:    num/1except (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 = 1try:    num/0except (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.messagetry:    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()方法。

转载于:https://www.cnblogs.com/gengcx/p/7259089.html

你可能感兴趣的文章
三阶魔方中心块调整配方和记忆方法
查看>>
***微信LBS地理位置开发+百度地图API(地理位置和坐标转换)
查看>>
如何获得WPA握手包&EWSA破解WPA密码教程[zz]
查看>>
CountDownTimer,0,0
查看>>
mac 终端 常用命令
查看>>
对VM挂载新加入的磁盘
查看>>
MyEclipse *的安装步骤和破解(32位和64位皆适用)(图文详解)
查看>>
如何撤销 PhpStorm/Clion 等 JetBrains 产品的 “Mark as Plain Text” 操作 ?
查看>>
使用maven创建web项目
查看>>
第三十八章 springboot+docker(maven)
查看>>
构建单页面应用
查看>>
BZOJ4078 : [Wf2014]Metal Processing Plant
查看>>
变量的数据类型的转换
查看>>
codevs1022 覆盖[Hungary 二分图最大匹配]
查看>>
Deci and Centi Seconds parsing in java
查看>>
ES mlockall作用——preventing that memory from being paged to the swap area
查看>>
How those spring enable annotations work--转
查看>>
【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控
查看>>
Mac系统中各个文件夹简单介绍(转)
查看>>
流媒体技术学习笔记之(八)海康、大华IpCamera RTSP地址和格式
查看>>