一、异常处理

在程序运行过程中,总会遇到各种各样的错误。程序一出错就停止运行了,那我们不能让程序停止运行吧,这时候就需要捕捉异常了,通过捕捉到的异常,我们再去做对应的处理。

下面我们先写一个函数,实现除法运算。

def calc(a,b):

    return a/b

print(calc(5,1))#调用,没有错误,结果是5.0

>>> 5.0

print(calc(5,0))#再次调用,这时候就不对了,因为被除数不能为0,下面报了一堆错,程序停止运行了

>>> ZeroDivisionError: division by zero

这个时候我们就需要捕捉异常了,如果除数是0的话,就提示用户传入的参数不对,重新传入。

捕捉异常使用try....except....关键字,就是你在写代码的时候,先要考虑到这段代码可能会出现什么样的错误,然后做对应的处理,try里面就是包含你做处理的代码,except里面就是出了某种错误的时候,我怎么去处理,下面我们改下代码,捕捉异常。

ef calc(a,b):

try:

res = a/b

except ZeroDivisionError as e:#如果是除数为0的错误,就返回除数不能为0,这个as e代表把返回错误的信息赋给e

return '除数不能为0!'

return res#这个是如果没有这个异常的话,就返回结果

print(calc(5,0))#这样再调用就不会出来错误了,就返回除数不能为0这个了。

上面就是捕捉异常,当然上面的只能捕捉到除数为0的错误,如果有别的错误就捕捉不到了;还有一个finally的用法,就是不管出不出异常都执行;try还有一个可以捕捉所有异常,还有else的用法,就是没出异常的时候怎么办,下面用代码来解释。

def calc(a, b):
try: # 捕捉异常
res = a / b
except ZeroDivisionError as e:
return '除数不能为0!'
except KeyError as e: # 捕捉KeyError这个异常,当然这段代码没用到字典,所以不会有keyerror这个错误,我只是举个例子
return 'keyerror错误'
except Exception as e: # 这个是捕捉所有的异常,不管你有什么异常都可以捕捉到
print('其他异常')
return e #返回错误信息
else: #这个else和上面的try对应的,也就是不出异常的话走这里
print('没有出异常')
return res
finally: #这个finally是不管这个段代码有没有出异常都走它
print('出没出异常都走我这里') print(calc(5, 0)) #出除数异常了,会返回除数不能为0!和执行finally里面的代码 print(calc(5, 1)) #这个没有出异常,就会走else里面的东西,返回结果,也会执行执行finally里面的代码 print(calc(5, 's')) #这个也走异常了,除数是字符串,肯定不能除,就走那个捕捉所有异常的代码了,也会执行执行finally里面的代码

二、常见的一些异常信息:

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

IOError:输入/输出异常,一般是无法打开文件

ImportError: 无法导入模块或包,一般是路径问题或名称错误

IndentationError:代码没有正确对齐,属于语法错误

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

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

KeyboardInterrupt:Ctrl+C被按下

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

SyntaxError: 语法错误

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

UnboundLocalError:试图访问一个还未被设置的局部变量,一般是由于在代码块外部还有另一个同名变量

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

三、主动抛出异常

主动抛出异常,就是我们在代码里面让它自动抛出一个异常,然后捕捉到,比如说我们在写自动化测试脚本的时候,结果和预期不符合,就可以主动抛出一个异常信息,然后捕捉到,做其他的处理,主动抛出异常使用raise关键字。

try:

    raise KeyError#主动抛出一个keyerror的异常

except KeyError as e:

    print('这个是我主动抛出的异常')

  

  

  

最新文章

  1. iOS中多线程知识总结(二)
  2. yii的入口文件index.php中为什么会有这两句
  3. 基于FS4412的DS18B20温度采集编程实现(1-时序分析)
  4. PHP debug 环境配置
  5. selenium python (二) 元素定位方法
  6. About TI CC3000 Wifi
  7. 【转】 Nginx系列(一)--nginx是什么?
  8. pl/sql developer 中文字段显示乱码
  9. Linux下使用dnf包管理器安装异常后导致的clear不可用
  10. iosTableView 局部全部刷新以及删除编辑操作
  11. Vijos 1033 整数分解(版本2)
  12. React Native踩坑之旅
  13. Linux 解决Linux下火狐浏览器中文乱码成方块显示问题
  14. H5新属性FileReader实现选择图片后立即显示在页面上
  15. X-factor Chains [POJ3421] [素数]
  16. Oracle对于敏感数据的处理,可以采用策略(dbms_rls.add_policy)
  17. 【POI每日题解 #9】SKA-Piggy Banks
  18. springboot---->获取不到yml配置文件指定的值
  19. 求组合数的O(n^2)和O(n)解法及模板
  20. 【bzoj4543】[POI2014]Hotel加强版

热门文章

  1. js核心对象
  2. 被辞退时N+1的说法
  3. 软件开的目录规范+sys,os,time模块
  4. 在DBGrid中,单击单元格选择整行,双击又可编辑单元格
  5. Docker报错总结
  6. java面试题整理(3)
  7. UUID类型如何比较是否相等
  8. CentOS 显示历史执行过的命令以及用户历史命令缓存文件
  9. 分数模板(C++模板)
  10. 沉迷Link-Cut tree无法自拔之:[BZOJ2049]洞穴勘探(蒟蒻的LCT板子)