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 01 Python
Python中itertools模块用法详解
Sep 25 Python
Django 添加静态文件的两种实现方法(必看篇)
Jul 14 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
Python键盘输入转换为列表的实例
Jun 23 Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 Python
python实现最大子序和(分治+动态规划)
Jul 05 Python
用Python解数独的方法示例
Oct 24 Python
Pytorch之Variable的用法
Dec 31 Python
Python基础之函数基本用法与进阶详解
Jan 02 Python
python实现Pyecharts实现动态地图(Map、Geo)
Mar 25 Python
python基于socket模拟实现ssh远程执行命令
Dec 05 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获取服务器时间的实现代码
2013/06/07 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
Extjs中常用表单介绍与应用
2010/06/07 Javascript
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
js实现交通灯效果
2017/01/13 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
深入理解nodejs搭建静态服务器(实现命令行)
2019/02/05 NodeJs
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
pymongo为mongodb数据库添加索引的方法
2015/05/11 Python
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
pytorch实现focal loss的两种方式小结
2020/01/02 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
JSP&Servlet技术面试题
2015/05/21 面试题
超市营业员岗位职责
2013/12/20 职场文书
服装设计专业求职信
2014/06/16 职场文书
公司授权委托书范本
2014/09/18 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书