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求解最大公约数的实现方法
Aug 20 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
Python实现按照指定要求逆序输出一个数字的方法
Apr 19 Python
深入分析python数据挖掘 Json结构分析
Apr 21 Python
python 把列表转化为字符串的方法
Oct 23 Python
Pyinstaller打包.py生成.exe的方法和报错总结
Apr 02 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
python能做什么 python的含义
Oct 12 Python
基于python 取余问题(%)详解
Jun 03 Python
基于django2.2连oracle11g解决版本冲突的问题
Jul 02 Python
numba提升python运行速度的实例方法
Jan 25 Python
python 中[0]*2与0*2的区别说明
May 10 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
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
php生成QRcode实例
2014/09/22 PHP
yii分页组件用法实例分析
2015/12/28 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
Javascript base64编码实现代码
2011/12/02 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
2016/03/17 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
微信小程序—setTimeOut定时器的问题及解决
2019/07/26 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
2019/09/02 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
Python内置函数之filter map reduce介绍
2014/11/30 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
python用插值法绘制平滑曲线
2021/02/19 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
Python将字典转换为XML的方法
2020/08/01 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
20佳惊艳的HTML5应用程序示例分享
2011/05/03 HTML / CSS
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
门卫人员岗位职责
2013/12/24 职场文书
产品设计开发计划书
2014/05/07 职场文书
辞职书格式样本
2015/02/26 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
css背景和边框标签实例详解
2021/05/21 HTML / CSS
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技