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实现爬取知乎神回复简单爬虫代码分享
Jan 04 Python
Python兔子毒药问题实例分析
Mar 05 Python
python实现简单ftp客户端的方法
Jun 28 Python
python使用matplotlib绘制热图
Nov 07 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
Python日志syslog使用原理详解
Feb 18 Python
Python关于__name__属性的含义和作用详解
Feb 19 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 Python
Django Form常用功能及代码示例
Oct 13 Python
基于OpenCV的路面质量检测的实现
Nov 04 Python
教你利用python实现企业微信发送消息
May 23 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 md5下16位和32位的实现代码
2008/04/09 PHP
php简单日历函数
2015/10/28 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
关于PHP求解三数之和问题详析
2020/11/09 PHP
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
2016/08/25 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
react中使用swiper的具体方法
2018/05/15 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
python获取外网ip地址的方法总结
2015/07/02 Python
Python作用域用法实例详解
2016/03/15 Python
详解Python使用simplejson模块解析JSON的方法
2016/03/24 Python
Python教程之全局变量用法
2016/06/27 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
树莓派实现移动拍照
2019/06/22 Python
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
英国钻石公司:British Diamond Company
2020/02/16 全球购物
反腐倡廉主题教育活动总结
2015/05/07 职场文书
科技活动总结范文
2015/05/11 职场文书
会议室使用管理制度
2015/08/06 职场文书
Python基础详解之描述符
2021/04/28 Python
Python time库的时间时钟处理
2021/05/02 Python
mysql使用 not int 子查询隐含陷阱
2022/04/12 MySQL
Redis特殊数据类型bitmap位图
2022/06/01 Redis