详解在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 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
Python中bisect的用法
Sep 23 Python
python动态性强类型用法实例
May 09 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
Jun 18 Python
详解Python多线程Selenium跨浏览器测试
Apr 01 Python
python正则实现提取电话功能
Feb 24 Python
python3学生名片管理v2.0版
Nov 29 Python
pyQt5实时刷新界面的示例
Jun 25 Python
python数据处理——对pandas进行数据变频或插值实例
Apr 22 Python
Windows下Anaconda和PyCharm的安装与使用详解
Apr 23 Python
如何在sublime编辑器中安装python
May 20 Python
如何用 Python 制作 GitHub 消息助手
Feb 20 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
ThinkPHP实现分页功能
2017/04/28 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
Javascript 解疑
2009/11/11 Javascript
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
基于jQuery架构javascript基础体系
2011/01/01 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
jquery密码强度校验
2015/12/02 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
Bootstrap编写导航栏和登陆框
2016/05/30 Javascript
JS代码实现根据时间变换页面背景效果
2016/06/16 Javascript
学习Bootstrap滚动监听 附调用方法
2016/07/02 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
Javascript 实现计算器时间功能详解及实例(二)
2017/01/08 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
layui 给数据表格加序号的方法
2018/08/20 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
Django中对数据查询结果进行排序的方法
2015/07/17 Python
python函数不定长参数使用方法解析
2019/12/14 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
2020/01/23 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
预备党员思想汇报范文
2013/12/29 职场文书
库房主管岗位职责
2013/12/31 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
学雷锋倡议书
2015/01/19 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android