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 相关文章推荐
python3.3实现乘法表示例
Feb 07 Python
Python中处理字符串的相关的len()方法的使用简介
May 19 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
http请求 request失败自动重新尝试代码示例
Jan 25 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
Jun 04 Python
Opencv实现抠图背景图替换功能
May 21 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
Python assert关键字原理及实例解析
Dec 13 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 Python
Python requests库参数提交的注意事项总结
Mar 29 Python
手残删除python之后的补救方法
Jun 26 Python
浅谈Python中对象是如何被调用的
Apr 06 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实现统计网站在线人数的方法
2015/05/12 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
JS中定位 position 的使用实例代码
2017/08/06 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
JavaScript实现下拉列表
2021/01/20 Javascript
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
python使用两种发邮件的方式smtp和outlook示例
2017/06/02 Python
python简单实例训练(21~30)
2017/11/15 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
详解Django的CSRF认证实现
2018/10/09 Python
python实现电子产品商店
2019/02/26 Python
Python寻找路径和查找文件路径的示例
2019/07/10 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
介绍一下linux的文件系统
2012/03/20 面试题
小学毕业感言150字
2014/02/05 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
小学生感恩演讲稿
2014/04/25 职场文书
幼儿评语大全
2014/04/30 职场文书
甜品店创业计划书
2014/08/14 职场文书
应聘教师自荐信
2015/03/26 职场文书
2015年党总支工作总结
2015/05/25 职场文书
身份证丢失证明
2015/06/19 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL
使用Docker容器部署rocketmq单机的全过程
2022/04/03 Servers