python进阶教程之异常处理


Posted in Python onAugust 30, 2014

在项目开发中,异常处理是不可或缺的。异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在。异常处理还可以提高程序的容错性。

我们之前在讲循环对象的时候,曾提到一个StopIteration的异常,该异常是在循环对象穷尽所有元素时的报错。

我们以它为例,来说明基本的异常处理。

一个包含异常的程序:

re = iter(range(5))
for i in range(100):

    print re.next()
print 'HaHaHaHa'

首先,我们定义了一个循环对象re,该循环对象将进行5次循环,每次使用序列的一个元素。

在随后的for循环中,我们手工调用next()函数。当循环进行到第6次的时候,re.next()不会再返回元素,而是抛出(raise)StopIteration的异常。整个程序将会中断。

我们可以修改以上异常程序,直到完美的没有bug。但另一方面,如果我们在写程序的时候,知道这里可能犯错以及可能的犯错类型,我们可以针对该异常类型定义好”应急预案“。

re = iter(range(5))
try:

    for i in range(100):

        print re.next()

except StopIteration:

    print 'here is end ',i
print 'HaHaHaHa'

在try程序段中,我们放入容易犯错的部分。我们可以跟上except,来说明如果在try部分的语句发生StopIteration时,程序该做的事情。如果没有发生异常,则except部分被跳过。

随后,程序将继续运行,而不是彻底中断。

完整的语法结构如下:

try:

    ...

except exception1:

    ...

except exception2:

    ...

except:

    ...

else:

    ...

finally:

    ...

如果try中有异常发生时,将执行异常的归属,执行except。异常层层比较,看是否是exception1, exception2...,直到找到其归属,执行相应的except中的语句。如果except后面没有任何参数,那么表示所有的exception都交给这段程序处理。比如:

try:

    print(a*2)

except TypeError:

    print("TypeError")

except:

    print("Not Type Error & Error noted")

由于a没有定义,所以是NameError。异常最终被except:部分的程序捕捉。

如果无法将异常交给合适的对象,异常将继续向上层抛出,直到被捕捉或者造成主程序报错。比如下面的程序

def test_func():

    try:

        m = 1/0

    except NameError:

        print("Catch NameError in the sub-function")
try:

    test_func()

except ZeroDivisionError:

    print("Catch error in the main program")

子程序的try...except...结构无法处理相应的除以0的错误,所以错误被抛给上层的主程序。

如果try中没有异常,那么except部分将跳过,执行else中的语句。

finally是无论是否有异常,最后都要做的一些事情。

流程如下,

try->异常->except->finally
try->无异常->else->finally

抛出异常

我们也可以自己写一个抛出异常的例子:

print 'Lalala'

raise StopIteration

print 'Hahaha'

这个例子不具备任何实际意义。只是为了说明raise语句的作用。

StopIteration是一个类。抛出异常时,会自动有一个中间环节,就是生成StopIteration的一个对象。Python实际上抛出的,是这个对象。当然,也可以自行生成对象:

raise StopIteration()

总结

try: ... except exception: ... else: ... finally: ...
raise exception

Python 相关文章推荐
python调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
Python中的数学运算操作符使用进阶
Jun 20 Python
利用numpy+matplotlib绘图的基本操作教程
May 03 Python
Python实现Logger打印功能的方法详解
Sep 01 Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
python得到windows自启动列表的方法
Oct 14 Python
Python线程池模块ThreadPoolExecutor用法分析
Dec 28 Python
python爬虫 execjs安装配置及使用
Jul 30 Python
selenium+PhantomJS爬取豆瓣读书
Aug 26 Python
PYcharm 激活方法(推荐)
Mar 23 Python
python 用opencv实现霍夫线变换
Nov 27 Python
python进阶教程之函数对象(函数也是对象)
Aug 30 #Python
python进阶教程之循环对象
Aug 30 #Python
python进阶教程之循环相关函数range、enumerate、zip
Aug 30 #Python
python进阶教程之函数参数的多种传递方法
Aug 30 #Python
python进阶教程之模块(module)介绍
Aug 30 #Python
Python中的闭包实例详解
Aug 29 #Python
python进阶教程之文本文件的读取和写入
Aug 29 #Python
You might like
PHP发送短信代码分享
2015/08/11 PHP
PHP 图片处理
2020/09/16 PHP
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
基于jquery实现的鼠标滑过按钮改变背景图片
2011/07/15 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
2020/04/21 Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
2018/07/23 Javascript
create-react-app安装出错问题解决方法
2018/09/04 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
解决vue项目router切换太慢问题
2020/07/19 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
Python中常用信号signal类型实例
2018/01/25 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
python的中异常处理机制
2018/08/30 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
比较一下entity bean和session bean
2013/12/27 面试题
学院书画协会部门岗位职责
2013/12/01 职场文书
小学亲子活动总结
2014/07/01 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
学生检讨书范文
2019/06/24 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
java调用Restful接口的三种方法
2021/08/23 Java/Android