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下使用Psyco模块优化运行速度
Apr 05 Python
python字符串对其居中显示的方法
Jul 11 Python
python3+PyQt5自定义视图详解
Apr 24 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
基于python修改srt字幕的时间轴
Feb 03 Python
python 实现字符串下标的输出功能
Feb 13 Python
Keras使用tensorboard显示训练过程的实例
Feb 15 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
Mar 13 Python
python实现超级马里奥
Mar 18 Python
python 实现任务管理清单案例
Apr 25 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
Jul 03 Python
Python绘制数码晶体管日期
Feb 19 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
jQuery 插件 将this下的div轮番显示
2009/04/09 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
2015/04/16 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
js实现简单选项卡功能
2020/03/23 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
查看Django和flask版本的方法
2018/05/14 Python
django模板加载静态文件的方法步骤
2019/03/01 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
如何给Python代码进行加密
2020/01/10 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
linux面试题参考答案(11)
2016/11/26 面试题
银行简历自我评价
2014/02/11 职场文书
机修工工作职责
2014/02/21 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
实习指导老师评语
2014/04/26 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
MySQL数据迁移相关总结
2021/04/29 MySQL
Anaconda配置各版本Pytorch的实现
2021/08/07 Python
业余无线电通联Q语
2022/02/18 无线电