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 05 Python
Python中return语句用法实例分析
Aug 04 Python
Linux中Python 环境软件包安装步骤
Mar 31 Python
Python实现的网页截图功能【PyQt4与selenium组件】
Jul 12 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
通过实例了解python property属性
Nov 01 Python
Python 3.8 新功能大揭秘【新手必学】
Feb 05 Python
python程序文件扩展名知识点详解
Feb 27 Python
pycharm实现在子类中添加一个父类没有的属性
Mar 12 Python
python实现人工蜂群算法
Sep 18 Python
Numpy实现卷积神经网络(CNN)的示例
Oct 09 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 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
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
动态表格Table类的实现
2009/08/26 Javascript
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
javascript将url解析为json格式的两种方法
2017/08/18 Javascript
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
解决vue刷新页面以后丢失store的数据问题
2020/08/11 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
利用python代码写的12306订票代码
2015/12/20 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
python and or用法详解
2019/06/26 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
2019/07/15 Python
python中的错误如何查看
2020/07/08 Python
python 实现倒计时功能(gui界面)
2020/11/11 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
Farnell德国:电子元器件供应商
2018/07/10 全球购物
命名空间(namespace)和程序集(Assembly)有什么区别
2015/09/25 面试题
结婚喜宴家长答谢词
2014/01/15 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang