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下的subprocess模块的入门指引
Apr 16 Python
Python实现一个简单的验证码程序
Nov 03 Python
利用Hyperic调用Python实现进程守护
Jan 02 Python
python批量替换多文件字符串问题详解
Apr 22 Python
Python 字符串转换为整形和浮点类型的方法
Jul 17 Python
Python 实现王者荣耀中的敏感词过滤示例
Jan 21 Python
python scatter散点图用循环分类法加图例
Mar 19 Python
python隐藏终端执行cmd命令的方法
Jun 24 Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 Python
如何实现Django Rest framework版本控制
Jul 25 Python
python多线程分块读取文件
Aug 29 Python
使用TensorFlow对图像进行随机旋转的实现示例
Jan 20 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
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
PHP+Ajax异步带进度条上传文件实例
2016/11/01 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
jquery插件实现轮播图效果
2020/10/19 jQuery
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
深入讲解Java编程中类的生命周期
2016/02/05 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
Python JSON格式数据的提取和保存的实现
2019/03/22 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
2015/03/17 HTML / CSS
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
车辆维修工自我评价怎么写
2013/09/20 职场文书
初中考试作弊检讨书
2014/02/01 职场文书
中专自我鉴定
2014/02/05 职场文书
协议书与合同的区别
2014/04/18 职场文书
国旗下讲话演讲稿
2014/05/08 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
2019年鼓励无偿献血倡议书
2019/09/17 职场文书
简单聊聊Golang中defer预计算参数
2022/03/25 Golang