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之hello world
May 21 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
用Python实现斐波那契(Fibonacci)函数
Mar 25 Python
Python OpenCV获取视频的方法
Feb 28 Python
python中logging包的使用总结
Feb 28 Python
python 定时器,轮询定时器的实例
Feb 20 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
Python获取浏览器窗口句柄过程解析
Jul 25 Python
python 用递归实现通用爬虫解析器
Apr 16 Python
详解Python flask的前后端交互
Mar 31 Python
python数字图像处理之对比度与亮度调整示例
Jun 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
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
php-fpm配置详解
2014/02/12 PHP
php限制文件下载速度的代码
2015/10/20 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
Display SQL Server Version Information
2007/06/21 Javascript
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
js轮播图代码分享
2016/07/14 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
2020/11/17 Vue.js
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
Python文件操作函数用法实例详解
2019/12/24 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
HTML5操作WebSQL数据库的实例代码
2017/08/26 HTML / CSS
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
无传销社区工作方案
2014/05/13 职场文书
个人四风对照检查材料
2014/09/26 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记