Python异常学习笔记


Posted in Python onFebruary 03, 2015

异常(exceptions)是Python中一种非常重要的类型,它和语法错误不同,是在程序运行期间引发的错误。Python中内置了很多异常,如IOError,NameError,KeyboardInterrupt等,更多的异常可以点击这里。

异常的意义在于提供一种更加优雅的运行方式,例如用Python编写一个计算器,如果用户输入不能计算的对象,则可以抛出异常,并进行处理, 如下:

while True:
  try:
    x= int(input('Please In enter A number:'))
    print "Your Input is %s"%x
    break
  except Exception,e:
    print e

Python是一门面向对象的语言,异常本身也是对象, 用dir(Exception)查看Exception类的属性,如下:[‘__class__', ‘__delattr__', ‘__dict__', ‘__doc__', ‘__format__', ‘__getattribute__', ‘__getitem__', ‘__getslice__', ‘__hash__', ‘__init__', ‘__new__', ‘__reduce__', ‘__reduce_ex__', ‘__repr__', ‘__setattr__', ‘__setstate__', ‘__sizeof__','__str__', ‘__subclasshook__', ‘__unicode__', ‘args', ‘message'], 除开args和message外,其余的均为其内部属性, 其中args是传递给异常类的构造函数的一个类型为元祖的参数, 一些内置函数,如IOError需要它接收多个参数,其它的则直接是直接传递一个错误提示字符串。

Python的异常可以通过try语句来检查,任何在try语句块里的代码都会被监测,检查有无异常产生,except会根据输入检查异常的类型,并执行except内的代码。那么,这里就不禁要问问,except后面的两个参数到底是什么?如果第一个是错误的类型,那么第二参数呢?对其进行检测,发现它是属于Exception的实例,也就是说,它是由异常类产生的一个具体的异常对象。
那么,用户如果自定义一个异常呢?Python中规定,所有异常必须直接或者间接的继承自Exception类,如下,自定义的异常:

#!/usr/bin/env python
class MyError(Exception):
  def __init__(self,*args):
    self.value=args[0]
  def __str__(self):
    return repr(self.value)
def showname(*args):
  if args:
    print args
  else:
    raise MyError('Error: need 1 arguments at last, 0 Input')

把这个文件保存为showname.py,其它模块就可以引入调用showname函数,并对它执行的结果进行检测:

#!/usr/bin/env python
import showname
try:
  showname.showname()
except showname.MyError,e:
  print e

值得注意的几点是:1, python中用raise抛出异常; 2, 由于所有异常都是继承自Exception,所以,当不确定异常类型的时候,可以在except后面直接接Exception来捕获所有异常;3,由于异常的继承关系,异常内的所有属性都是可以被重定义的,也可以在自定义的异常上增加属性。

Python 相关文章推荐
python解决字典中的值是列表问题的方法
Mar 04 Python
Python 字典(Dictionary)操作详解
Mar 11 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
Apr 05 Python
详解常用查找数据结构及算法(Python实现)
Dec 09 Python
selenium+python设置爬虫代理IP的方法
Nov 29 Python
Python异步操作MySQL示例【使用aiomysql】
May 16 Python
简单了解django orm中介模型
Jul 30 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
Oct 11 Python
python求质数列表的例子
Nov 24 Python
django自定义非主键自增字段类型详解(auto increment field)
Mar 30 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 24 Python
Python中的迭代器漫谈
Feb 03 #Python
Python描述器descriptor详解
Feb 03 #Python
理解Python中的With语句
Feb 02 #Python
Linux环境下MySQL-python安装过程分享
Feb 02 #Python
Python中用pycurl监控http响应时间脚本分享
Feb 02 #Python
Python列表(list)常用操作方法小结
Feb 02 #Python
Python Sleep休眠函数使用简单实例
Feb 02 #Python
You might like
PHP新手上路(七)
2006/10/09 PHP
php数组总结篇(一)
2008/09/30 PHP
一个PHP的QRcode类与大家分享
2011/11/13 PHP
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
PHP截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
js获取class的所有元素
2013/03/28 Javascript
Javascript操作URL函数修改版
2013/11/07 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
js的toUpperCase方法用法实例
2015/01/27 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
AngularJS过滤器filter用法分析
2016/12/11 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
2014/05/05 Python
Python字符串、元组、列表、字典互相转换的方法
2016/01/23 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
Python实现把类当做字典来访问
2019/12/16 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
社区春季防火方案
2014/06/02 职场文书
竞选纪律委员演讲稿
2014/09/13 职场文书
工商局个人工作总结
2015/03/03 职场文书
2015年中个人总结范文
2015/03/10 职场文书
庆七一活动简报
2015/07/20 职场文书
村主任当选感言
2015/08/01 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书
推普标语口号大全
2015/12/26 职场文书
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python
使用scrapy实现增量式爬取方式
2022/06/21 Python