详解在Python程序中自定义异常的方法


Posted in Python onOctober 16, 2015

通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。
以下为与RuntimeError相关的实例,实例中创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息。
在try语句块中,用户自定义的异常后执行except块语句,变量 e 是用于创建Networkerror类的实例。

class Networkerror(RuntimeError):
  def __init__(self, arg):
   self.args = arg

在你定义以上类后,你可以触发该异常,如下所示:

try:
  raise Networkerror("Bad hostname")
except Networkerror,e:
  print e.args

在下面这个例子中,默认的__init__()异常已被我们重写。

>>> class MyError(Exception):
...   def __init__(self, value):
...     self.value = value
...   def __str__(self):
...     return repr(self.value)
...
>>> try:
...   raise MyError(2*2)
... except MyError as e:
...   print 'My exception occurred, value:', e.value
...
My exception occurred, value: 4
>>> raise MyError, 'oops!'
Traceback (most recent call last):
 File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'

常见的做法是创建一个由该模块定义的异常基类和子类,创建特定的异常类不同的错误条件。

我们通常定义的异常类,会让它比较简单,允许提取异常处理程序的错误信息,当创建一个异常模块的时候,常见的做法是创建一个由该模块定义的异常基类和子类,根据不同的错误条件,创建特定的异常类:

class Error(Exception):
  """Base class for exceptions in this module."""
  pass

class InputError(Error):
  """Exception raised for errors in the input.

  Attributes:
    expression -- input expression in which the error occurred
    message -- explanation of the error
  """

  def __init__(self, expression, message):
    self.expression = expression
    self.message = message

class TransitionError(Error):
  """Raised when an operation attempts a state transition that's not
  allowed.

  Attributes:
    previous -- state at beginning of transition
    next -- attempted new state
    message -- explanation of why the specific transition is not allowed
  """

  def __init__(self, previous, next, message):
    self.previous = previous
    self.next = next
    self.message = message
Python 相关文章推荐
python通过exifread模块获得图片exif信息的方法
Mar 16 Python
Python中pandas dataframe删除一行或一列:drop函数详解
Jul 03 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
举例讲解Python常用模块
Mar 08 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
分享8点超级有用的Python编程建议(推荐)
Oct 13 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
Django media static外部访问Django中的图片设置教程
Apr 07 Python
python Timer 类使用介绍
Dec 28 Python
Python中第三方库Faker的使用详解
Apr 02 Python
python运行脚本文件的三种方法实例
Jun 25 Python
Python编程中的文件操作攻略
Oct 16 #Python
详解Python编程中包的概念与管理
Oct 16 #Python
解读Python编程中的命名空间与作用域
Oct 16 #Python
Python中的模块导入和读取键盘输入的方法
Oct 16 #Python
Python中基本的日期时间处理的学习教程
Oct 16 #Python
简单介绍使用Python解析并修改XML文档的方法
Oct 15 #Python
Python中将字典转换为XML以及相关的命名空间解析
Oct 15 #Python
You might like
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
解决php接收shell返回的结果中文乱码问题
2014/01/23 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
javascript的内存管理详解
2013/08/07 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
JS验证图片格式和大小并预览的简单实例
2016/10/11 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
[42:36]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第二局
2016/02/26 DOTA
Python使用gensim计算文档相似性
2016/04/10 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
快速了解Python相对导入
2018/01/12 Python
Python-接口开发入门解析
2019/08/01 Python
Django 源码WSGI剖析过程详解
2019/08/05 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
python/golang 删除链表中的元素
2020/09/14 Python
python给list排序的简单方法
2020/12/10 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
中学生差生评语
2014/01/30 职场文书
项目采购员岗位职责
2014/04/15 职场文书
医院搬迁方案
2014/06/14 职场文书
法人委托书范本格式
2014/09/15 职场文书
结婚保证书
2015/01/16 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
MySQL8.0的WITH查询详情
2021/08/30 MySQL
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android
vue自定义右键菜单之全局实现
2022/04/09 Vue.js