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发送邮件实例讲解(python发邮件附件可以使用email模块实现)
Dec 03 Python
python基础教程之元组操作使用详解
Mar 25 Python
使用Python抓取模板之家的CSS模板
Mar 16 Python
Python随机生成信用卡卡号的实现方法
May 14 Python
python通过socket实现多个连接并实现ssh功能详解
Nov 08 Python
django 删除数据库表后重新同步的方法
May 27 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
Oct 24 Python
Python读取Excel数据并生成图表过程解析
Jun 18 Python
详解python的变量缓存机制
Jan 24 Python
Python必备技巧之字符数据操作详解
Mar 23 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打印输出棋盘的实现方法
2014/12/23 PHP
php实现的一段简单概率相关代码
2016/05/30 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
javascript 常用功能总结
2012/03/18 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
2014/04/04 Javascript
JS交换变量的方法
2015/01/21 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
微信小程序 实现动态显示和隐藏某个控件
2017/04/27 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
2017/04/27 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
小程序实现授权登陆的解决方案
2018/12/02 Javascript
Vue vm.$attrs使用场景详解
2020/03/08 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
使用python实现多维数据降维操作
2020/02/24 Python
python用什么编辑器进行项目开发
2020/06/17 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
个人素质的自我评价分享
2013/12/16 职场文书
和平主题的演讲稿
2014/01/12 职场文书
核心价值观演讲稿
2014/05/13 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
高中家长意见怎么写
2015/06/03 职场文书
CSS3常见动画的实现方式
2021/04/14 HTML / CSS
python缺失值的解决方法总结
2021/06/09 Python