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实现的科学计算器功能示例
Aug 04 Python
Django中的CBV和FBV示例介绍
Feb 25 Python
python编写弹球游戏的实现代码
Mar 12 Python
Python通过调用mysql存储过程实现更新数据功能示例
Apr 03 Python
python实现决策树ID3算法的示例代码
May 30 Python
python leetcode 字符串相乘实例详解
Sep 03 Python
pandas 数据索引与选取的实现方法
Jun 21 Python
Pytorch之finetune使用详解
Jan 18 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 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
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
javascript学习之json入门
2016/12/22 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
2017/01/05 Javascript
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
js评分组件使用详解
2017/06/06 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
2020/12/24 Javascript
python链接Oracle数据库的方法
2015/06/28 Python
Python中字符串格式化str.format的详细介绍
2017/02/17 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
python实现贪吃蛇小游戏
2020/03/21 Python
django实现用户注册实例讲解
2019/10/30 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
加拿大在线眼镜零售商:SmartBuyGlasses加拿大
2019/05/25 全球购物
经管应届生求职信
2013/11/17 职场文书
工业自动化专业毕业生推荐信
2013/11/18 职场文书
检举信的格式及范文
2014/04/04 职场文书
协议书格式
2014/04/23 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书
部门主管竞聘书
2015/09/15 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
V Rising 服务器搭建图文教程
2022/06/16 Servers
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers