详解在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 相关文章推荐
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
Dec 10 Python
解决已经安装requests,却依然提示No module named requests问题
May 18 Python
python简易实现任意位数的水仙花实例
Nov 13 Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 Python
python使用matplotlib绘制雷达图
Oct 18 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 Python
python中操作文件的模块的方法总结
Feb 04 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 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
php基础知识:控制结构
2006/12/13 PHP
mysql数据库差异比较的PHP代码
2012/02/05 PHP
php实现插入排序
2015/03/29 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
基于jQuery Ajax实现下拉框无刷新联动
2017/12/06 jQuery
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
[01:27:43]VGJ.S vs TNC Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
Python3.0与2.X版本的区别实例分析
2014/08/25 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
python简单获取本机计算机名和IP地址的方法
2015/06/03 Python
Python中GIL的使用详解
2018/10/03 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
深入浅析python变量加逗号,的含义
2020/02/22 Python
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
学生评语集锦
2015/01/04 职场文书
三好学生个人总结
2015/02/15 职场文书
2015年生产部工作总结范文
2015/05/25 职场文书
读书笔记怎么写
2015/07/01 职场文书
三年级作文之趣事作文
2019/11/04 职场文书
python解决12306登录验证码的实现
2021/04/18 Python
分析MySQL优化 index merge 后引起的死锁
2022/04/19 MySQL
Python 视频画质增强
2022/04/28 Python
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android