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错误: SyntaxError: Non-ASCII character解决办法
Jun 08 Python
初学python的操作难点总结(新手必看篇)
Aug 03 Python
人工智能最火编程语言 Python大战Java!
Nov 13 Python
Python基于PyGraphics包实现图片截取功能的方法
Dec 21 Python
python GUI实现小球满屏乱跑效果
May 09 Python
django2笔记之路由path语法的实现
Jul 17 Python
pymysql 插入数据 转义处理方式
Mar 02 Python
jupyter 导入csv文件方式
Apr 21 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
python利用paramiko实现交换机巡检的示例
Sep 22 Python
如何用Python和JS实现的Web SSH工具
Feb 23 Python
关于Python中*args和**kwargs的深入理解
Aug 07 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的抽象类和抽象方法以及接口总结
2019/03/15 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
jquery将一个表单序列化为一个对象的方法
2014/01/03 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
JavaScript函数详解
2014/11/17 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
js实现根据身份证号自动生成出生日期
2015/12/15 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
在Django的视图中使用form对象的方法
2015/07/18 Python
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
Python正则表达式完全指南
2017/05/25 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
python math模块的基本使用教程
2021/01/16 Python
Css3新特性应用之视觉效果实例
2016/12/12 HTML / CSS
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
大学生家政服务项目创业计划书
2014/01/30 职场文书
环保公益广告语
2014/03/13 职场文书
运动会宣传稿50字
2015/07/23 职场文书
感谢信
2019/04/11 职场文书