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中尝试多线程编程的一个简明例子
Apr 07 Python
python opencv设置摄像头分辨率以及各个参数的方法
Apr 02 Python
pandas将numpy数组写入到csv的实例
Jul 04 Python
Python绘制KS曲线的实现方法
Aug 13 Python
python占位符输入方式实例
May 27 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
Python中 CSV格式清洗与转换的实例代码
Aug 29 Python
pandas factorize实现将字符串特征转化为数字特征
Dec 19 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
May 23 Python
python 读取.nii格式图像实例
Jul 01 Python
python实现最短路径的实例方法
Jul 19 Python
class类在python中获取金融数据的实例方法
Dec 10 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
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
2017/03/14 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
Python常用内置函数总结
2015/02/08 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
django静态文件加载的方法
2018/05/20 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
详解numpy的argmax的具体使用
2019/05/27 Python
Python 3 判断2个字典相同
2019/08/06 Python
python生成大写32位uuid代码
2020/03/03 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
上学迟到的检讨书
2014/01/11 职场文书
绩效工资实施方案
2014/03/15 职场文书
2015入党自传书范文
2015/06/26 职场文书
电视新闻稿
2015/07/17 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python
python内置模块之上下文管理contextlib
2022/06/14 Python