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定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
python基础之入门必看操作
Jul 26 Python
Python爬虫设置代理IP的方法(爬虫技巧)
Mar 04 Python
Python 3.6 读取并操作文件内容的实例
Apr 23 Python
Python查看微信撤回消息代码
Jun 07 Python
安装Pycharm2019以及配置anconda教程的方法步骤
Nov 11 Python
使用TensorFlow-Slim进行图像分类的实现
Dec 31 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
keras 指定程序在某块卡上训练实例
Jun 22 Python
python右对齐的实例方法
Jul 05 Python
python实现图片,视频人脸识别(opencv版)
Nov 18 Python
Python中for后接else的语法使用
May 18 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
在字符串中把网址改成超级链接
2006/10/09 PHP
php与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
php邮件发送,php发送邮件的类
2011/03/24 PHP
深入php数据采集的详解
2013/06/02 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
一端时间轮换的广告
2006/06/26 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
javascript实现图片自动和可控的轮播切换特效
2015/04/13 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
动态加载JavaScript文件的两种方法
2016/04/22 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
详解python中的线程与线程池
2019/05/10 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
Python list与NumPy array 区分详解
2019/11/06 Python
pandas 数据类型转换的实现
2020/12/29 Python
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
DJI全球:DJI Global
2021/03/15 全球购物
煤矿安全生产标语
2014/06/06 职场文书
个人查摆剖析材料
2014/10/04 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
公司内部升职自荐信
2015/03/27 职场文书
走进科学观后感
2015/06/18 职场文书
Python使用scapy模块发包收包
2021/05/07 Python
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL