详解在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中的exec、eval使用实例
Sep 23 Python
Python中方法链的使用方法
Feb 23 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
Jun 15 Python
python虚拟环境的安装配置图文教程
Oct 20 Python
python查看模块,对象的函数方法
Oct 16 Python
Python除法之传统除法、Floor除法及真除法实例详解
May 23 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
Jun 13 Python
Django框架组成结构、基本概念与文件功能分析
Jul 30 Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 Python
基于python3生成标签云代码解析
Feb 18 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 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中使用Oracle数据库(2)
2006/10/09 PHP
php中看实例学正则表达式
2006/12/25 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
Symfony生成二维码的方法
2016/02/04 PHP
smarty的section嵌套循环用法示例
2016/05/28 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
PHP常见的6个错误提示及解决方法
2016/07/07 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
input框中的name和id的区别
2016/11/16 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python批量获取html内body内容的实例
2019/01/02 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
python各层级目录下import方法代码实例
2020/01/20 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
瑞士设计师家具和家居饰品网上商店:Bruno Wickart
2019/03/18 全球购物
计算机专业学生求职信分享
2013/12/15 职场文书
六五普法规划实施方案
2014/03/21 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
好好学习保证书
2015/02/26 职场文书
研究生导师推荐信
2015/03/25 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
Python软件包安装的三种常见方法
2022/07/07 Python