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 相关文章推荐
pycharm 使用心得(二)设置字体大小
Jun 05 Python
python装饰器初探(推荐)
Jul 21 Python
Python 获取当前所在目录的方法详解
Aug 02 Python
python中的迭代和可迭代对象代码示例
Dec 27 Python
Python字典循环添加一键多值的用法实例
Jan 20 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 Python
python随机生成库faker库api实例详解
Nov 28 Python
python中文分词库jieba使用方法详解
Feb 11 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 Python
PyQt中使用QtSql连接MySql数据库的方法
Jul 28 Python
对象析构函数__del__在Python中何时使用
Mar 22 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
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
两级联动select刷新后其值保持不变的实现方法
2014/01/27 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
浅谈PHP安全防护之Web攻击
2017/01/03 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
2011/12/20 Javascript
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
2013/06/21 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
Jquery Easyui日历组件Calender使用详解(23)
2016/12/18 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
vue组件之间的数据传递方法详解
2019/04/19 Javascript
JS数组的常用10种方法详解
2020/05/08 Javascript
JS实现点击掉落特效
2021/01/29 Javascript
Python argv用法详解
2016/01/08 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
Django如何自定义分页
2018/09/25 Python
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
Python 从相对路径下import的方法
2018/12/04 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
世界上最好的足球商店:Unisport
2019/03/02 全球购物
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
计算机考试作弊检讨书1000字
2015/01/01 职场文书
电影建国大业观后感
2015/06/01 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书