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 BeautifulSoup使用方法详解
Nov 21 Python
Python 模拟登陆的两种实现方法
Aug 10 Python
Python模拟随机游走图形效果示例
Feb 06 Python
python中返回矩阵的行列方法
Apr 04 Python
Python中多个数组行合并及列合并的方法总结
Apr 12 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
使用Python获取并处理IP的类型及格式方法
Nov 01 Python
python文件拆分与重组实例
Dec 10 Python
Python3安装pip工具的详细步骤
Oct 14 Python
浅析Python3 pip换源问题
Jan 06 Python
自学python用什么系统好
Jun 23 Python
Python3爬虫关于识别点触点选验证码的实例讲解
Jul 30 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配合jquery实现增删操作具体实例
2013/12/12 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
JavaScript中对象property的读取和写入方法介绍
2014/12/30 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
Python转换HTML到Text纯文本的方法
2015/01/15 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
Python控制Firefox方法总结
2019/06/03 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
Python同时迭代多个序列的方法
2020/07/28 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
const和static readonly区别
2013/05/20 面试题
注塑工厂厂长岗位职责
2013/12/02 职场文书
国培教师自我鉴定
2014/02/12 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
快餐公司创业计划书
2014/04/29 职场文书
党支部书记岗位职责
2015/02/15 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
pytorch中的 .view()函数的用法介绍
2022/03/17 Python