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随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
Python基于socket模块实现UDP通信功能示例
Apr 10 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
使用Windows批处理和WMI设置Python的环境变量方法
Aug 14 Python
python requests更换代理适用于IP频率限制的方法
Aug 21 Python
Python lambda表达式filter、map、reduce函数用法解析
Sep 11 Python
Python 音频生成器的实现示例
Dec 24 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
Jul 02 Python
Python爬虫抓取指定网页图片代码实例
Jul 24 Python
python tkinter模块的简单使用
Apr 07 Python
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
May 28 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
ASP知识讲座四
2006/10/09 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
2016/02/01 PHP
PHP消息队列用法实例分析
2016/02/12 PHP
微信支付扫码支付php版
2016/07/22 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
vue.js的状态管理vuex中store的使用详解
2019/11/08 Javascript
python实现删除文件与目录的方法
2014/11/10 Python
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
python删除不需要的python文件方法
2018/04/24 Python
Python应用库大全总结
2018/05/30 Python
python并发和异步编程实例
2018/11/15 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
设计师大码女装:11 Honoré
2020/05/03 全球购物
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
自我鉴定范文200字
2013/10/02 职场文书
总经理检讨书
2014/09/15 职场文书
考试作弊检讨书
2014/10/21 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server
Python中for后接else的语法使用
2021/05/18 Python