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两种遍历字典(dict)的方法比较
May 29 Python
Python爬虫工程师面试问题总结
Mar 22 Python
Python中多个数组行合并及列合并的方法总结
Apr 12 Python
Python 多维List创建的问题小结
Jan 18 Python
pandas中的series数据类型详解
Jul 06 Python
Django 路由控制的实现
Jul 17 Python
django ManyToManyField多对多关系的实例详解
Aug 09 Python
Python通过cv2读取多个USB摄像头
Aug 28 Python
python字符串替换re.sub()方法解析
Sep 18 Python
如何利用pygame实现简单的五子棋游戏
Dec 29 Python
python 实现任务管理清单案例
Apr 25 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 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新手谈谈我的学习心得
2007/02/25 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
php设计模式之工厂模式用法经典实例分析
2019/09/20 PHP
javascript基本包装类型介绍
2015/04/10 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
Python中使用不同编码读写txt文件详解
2015/05/28 Python
Python中的一些陷阱与技巧小结
2015/07/10 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
Python同步遍历多个列表的示例
2019/02/19 Python
python获取栅格点和面值的实现
2020/03/10 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
新闻专业应届生求职信
2013/10/31 职场文书
小学生演讲稿
2014/01/12 职场文书
三分钟英语演讲稿
2014/04/24 职场文书
小学生学雷锋演讲稿
2014/04/25 职场文书
青春演讲稿范文
2014/05/08 职场文书
孝老爱亲模范事迹材料
2014/05/25 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS