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 相关文章推荐
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
Python简单计算文件夹大小的方法
Jul 14 Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
Python聊天室实例程序分享
Jan 05 Python
Pycharm学习教程(3) 代码运行调试
May 03 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
python 读取dicom文件,生成info.txt和raw文件的方法
Jan 24 Python
Django中间件基础用法详解
Jul 18 Python
django项目用higcharts统计最近七天文章点击量
Aug 17 Python
使用python动态生成波形曲线的实现
Dec 04 Python
Python Opencv实现单目标检测的示例代码
Sep 08 Python
Python之多进程与多线程的使用
Feb 23 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
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
超棒的响应式布局jQuery插件Freetile.js
2014/11/17 Javascript
AngularJS基础知识
2014/12/21 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
django模板加载静态文件的方法步骤
2019/03/01 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
Python基于os.environ从windows获取环境变量
2020/06/09 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
医生进修自我鉴定
2014/01/19 职场文书
委托书范文
2014/04/02 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
办公室岗位职责
2015/02/04 职场文书