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入门篇之字典
Oct 17 Python
浅析PHP与Python进行数据交互
May 15 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
Python实现网页截图(PyQT5)过程解析
Aug 12 Python
python3 求约数的实例
Dec 05 Python
Python socket聊天脚本代码实例
Jan 02 Python
python实现贪吃蛇双人大战
Apr 18 Python
keras中的loss、optimizer、metrics用法
Jun 15 Python
详解python tcp编程
Aug 24 Python
属性与 @property 方法让你的python更高效
Sep 21 Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 Python
python中os.remove()用法及注意事项
Jan 31 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编程入门的基本语法知识点总结
2016/01/26 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
2017/05/20 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
5 cool javascript apps
2007/03/24 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
常见的jQuery选择器汇总
2014/11/24 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
Python使用filetype精确判断文件类型
2017/07/02 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
python3安装speech语音模块的方法
2018/12/24 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
Python几种常见算法汇总
2020/06/02 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
英语自我评价范文
2014/01/24 职场文书
社会学专业求职信
2014/02/24 职场文书
实用的简历自我评价
2014/03/06 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
高三语文复习计划
2015/01/19 职场文书
安阳殷墟导游词
2015/02/10 职场文书
小学运动会入场口号
2015/12/24 职场文书
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android