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中pip安装非PyPI官网第三方库的方法
Jun 02 Python
详解Python中使用base64模块来处理base64编码的方法
Jul 01 Python
Python利用flask sqlalchemy实现分页效果
Aug 02 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
Oct 21 Python
python pands实现execl转csv 并修改csv指定列的方法
Dec 12 Python
Python3实现获取图片文字里中文的方法分析
Dec 13 Python
Python字符串对象实现原理详解
Jul 01 Python
Python实现把类当做字典来访问
Dec 16 Python
tornado+celery的简单使用详解
Dec 21 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
Mar 24 Python
selenium切换标签页解决get超时问题的完整代码
Aug 30 Python
Python pathlib模块使用方法及实例解析
Oct 05 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/11/16 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
JS 文件大小判断的实现代码
2010/04/07 Javascript
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
微信小程序实现图片放大预览功能
2020/10/22 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
python网络编程示例(客户端与服务端)
2014/04/24 Python
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
酒店个人培训自我鉴定
2013/12/11 职场文书
车队司机自我鉴定
2014/03/02 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
部门2014年度工作总结
2014/11/12 职场文书
应聘教师求职信范文
2015/03/20 职场文书
离职证明范本
2015/06/12 职场文书
Java Spring Lifecycle的使用
2022/05/06 Java/Android