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批量按比例缩小图片脚本分享
May 21 Python
Python的Django框架中自定义模版标签的示例
Jul 20 Python
Python中的数据对象持久化存储模块pickle的使用示例
Mar 03 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
Python探索之ModelForm代码详解
Oct 26 Python
Python 动态变量名定义与调用方法
Feb 09 Python
Python中使用threading.Event协调线程的运行详解
May 02 Python
Python调用OpenCV实现图像平滑代码实例
Jun 19 Python
Python logging模块进行封装实现原理解析
Aug 07 Python
python中使用 unittest.TestCase单元测试的用例详解
Aug 30 Python
Python中的datetime包与time包包和模块详情
Feb 28 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/11/18 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
js版本A*寻路算法
2006/12/22 Javascript
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
2014/04/23 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
javascript实用方法总结
2015/02/06 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
JQuery.validate在ie8下不支持的快速解决方法
2016/05/18 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
javascript设计模式之装饰者模式
2020/01/30 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
[01:09]DOTA2次级职业联赛 - 99战队宣传片
2014/12/01 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
十个Python程序员易犯的错误
2015/12/15 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
python 实现多维数组转向量
2019/11/30 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
美国时尚女装在线:Missguided
2016/12/03 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
异步传递消息系统的作用
2016/05/01 面试题
中专生学习生活的自我评价分享
2013/10/27 职场文书
个人教师自我评价范文
2013/12/02 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电