Python中的异常处理学习笔记


Posted in Python onJanuary 28, 2015

Python 是面向对象的语言,所以程序抛出的异常也是类。

常见的异常类

1.NameError:尝试访问一个没有申明的变量
2.ZeroDivisionError:除数为 0
3.SyntaxError:语法错误
4.IndexError:索引超出序列范围
5.KeyError:请求一个不存在的字典关键字
6.IOError:输入输出错误(比如你要读的文件不存在)
7.AttributeError:尝试访问未知的对象属性
8.TypeError:传给函数的参数类型不正确,比如给 int 函数传入字符型

自定义异常类

尽管内建的异常类已经包括大部分情况,但如果需要创建自己的异常类,可以采用下面的方法:

class CustomException(Exception): # Exception 为所有异常的基类

    # 处理异常的代码

捕获异常

try:  

   # 需要进行捕获异常的代码,只有出现异常之前的代码被最终执行

except (Exception1,Exception2,...) as argument:  

   # 捕获到 (Exception1,Exception2,...) 里的异常才执行本段代码

   # argument 是一个异常类的实例,包含异常的具体信息

except:

   # 捕获到 (Exception1,Exception2,...) 以外的异常执行本段代码,用 sys 模块的 exc_info() 函数可以获取异常信息

else:  

   # 如果没有捕获到异常则执行本段代码

finally:  

   # 无论是否捕获到异常都执行本段代码

上述语句并不都是必须的,譬如 try...except...、try...finally... 或者 try...except...else... 语句都是可行的。我们还可以 用 try...except...else... 代替 if...else...。

抛出异常

如果我们想要在自己编写的程序中主动抛出异常,可以采用如下两种方法:

raise Exception(reason)

Exception 必须是一个异常类的名称。可选项 reason 用来传递异常的信息。

assert expression[,reason]

assert 是断言的关键字。当表达式 expression 为真则什么都不做,否则抛出 AssertionError 异常。reason 提供异常的信息。

上下文管理器

由于对象 File 支持上下文管理协议,因此可以采用下面的方法打开文件:

with open('filename') as fp: 

   # 无论本段代码是否出现异常,文件对象 fp 均能正确关闭

Example

import sys
def div(num, den): 

 print('_________________   (',num,',',den,')\n')

 try:

  ans = num/den

  assert den != num, 'Equal' # 断言:分子分母不相等

  den = 'Changed'            # 如果执行本语句之前未出现异常,改变 den 的值

  if num % 2:                # 如果分子为奇数,则抛出异常

   raise ValueError('Odd')

 except ZeroDivisionError as e:

  print('except ... as ...\n\t', e)

 except:

  print('except\n\t', sys.exc_info())

 else:

  print('else\n\t', ans)

 finally:

  print('finally\n\t', den)
div(1,0) # 除数为零,为 ZeroDivisionError 异常类

div(1,1) # 分子等于分母,断言为假,抛出异常

div(2,1) # 无异常

div(3,1) # 分子为奇数,通过 raise 抛出异常

div(3,'x') # 不属于 ZeroDivisionError 的其他异常

运行结果:
_________________   ( 1 , 0 )
except ... as ...

  division by zero

finally

  0

_________________   ( 1 , 1 )
except

  (<class 'AssertionError'>, AssertionError('Equal',), <traceback object at 0x00000000029B42C8>)

finally

  1

_________________   ( 2 , 1 )
else

  2.0

finally

  Changed

_________________   ( 3 , 1 )
except

  (<class 'ValueError'>, ValueError('Odd',), <traceback object at 0x00000000029B42C8>)

finally

  Changed

_________________   ( 3 , x )
except

  (<class 'TypeError'>, TypeError("unsupported operand type(s) for /: 'int' and 'str'",), <traceback object at 0x00000000029B42C8>)

finally

  x
Python 相关文章推荐
python下函数参数的传递(参数带星号的说明)
Sep 19 Python
Python+Wordpress制作小说站
Apr 14 Python
Python面向对象之继承代码详解
Jan 29 Python
浅谈python爬虫使用Selenium模拟浏览器行为
Feb 23 Python
解决pandas中读取中文名称的csv文件报错的问题
Jul 04 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
Nov 16 Python
python hash每次调用结果不同的原因
Nov 21 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
如何基于Python实现自动扫雷
Jan 06 Python
浅谈keras的深度模型训练过程及结果记录方式
Jan 24 Python
python3 hdf5文件 遍历代码
May 19 Python
Python中集合类型(set)学习小结
Jan 28 #Python
Python中使用装饰器和元编程实现结构体类实例
Jan 28 #Python
Python实现Const详解
Jan 27 #Python
python映射列表实例分析
Jan 26 #Python
Python操作MySQL简单实现方法
Jan 26 #Python
Python中的is和id用法分析
Jan 26 #Python
Python的批量远程管理和部署工具Fabric用法实例
Jan 23 #Python
You might like
咖啡的植物学知识
2021/03/03 咖啡文化
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
浅谈PHP强制类型转换,慎用!
2013/06/06 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
无需数据库在线投票调查php代码
2016/07/20 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
jquery选择器简述
2015/08/31 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
jQuery向webApi提交post json数据
2017/01/16 Javascript
javascript中BOM基础知识总结
2017/02/14 Javascript
vue中关闭eslint的方法分析
2018/08/04 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
javascript随机变色实例代码
2019/10/15 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
Python列表推导式实现代码实例
2020/09/09 Python
全球性的在线商店:Vogca
2019/05/10 全球购物
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
Skyscanner新西兰:全球领先的旅游搜索网站
2019/08/26 全球购物
淘宝活动策划方案
2014/02/06 职场文书
纪律教育月活动总结
2014/08/26 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
心得体会该怎么写呢?
2019/06/27 职场文书
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL