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中__slots__用法实例
Jun 04 Python
人机交互程序 python实现人机对话
Nov 14 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
May 10 Python
django反向解析URL和URL命名空间的方法
Jun 05 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
Python实现的连接mssql数据库操作示例
Aug 17 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
Apr 26 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
Apr 14 Python
详解python中的lambda与sorted函数
Sep 04 Python
Django中的DateTimeField和DateField实现
Feb 24 Python
再谈python_tkinter弹出对话框创建
Mar 20 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设计模式之装饰者模式
2012/02/29 PHP
php无限级分类实现方法分析
2016/10/19 PHP
javascript URL锚点取值方法
2009/02/25 Javascript
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
python里将list中元素依次向前移动一位
2014/09/12 Python
python使用分治法实现求解最大值的方法
2015/05/12 Python
Python实现字典依据value排序
2016/02/24 Python
python学生信息管理系统(初级版)
2018/10/17 Python
pandas 空数据处理方法详解
2019/11/02 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
联谊会主持词
2014/03/26 职场文书
生产助理岗位职责
2014/06/18 职场文书
小学阳光体育活动总结
2014/07/05 职场文书
给校长的建议书范文
2015/09/14 职场文书