类的异常表现

  • 小明被绿了,开始暴躁了。

    ---------------------------------------超人小明
    --------------------属性----------------
    --------------------方法----------------
    滚出去: 多次让小明滚出去,可能会挨揍
    写给老婆阿芳的家信:每次想起深爱的阿花,小明都会崩溃
  • 方法说明:

    • 滚出去:每次让小明滚出去都可能收获一个意料之外的拳头
    • 写给老婆阿芳的家信:每次调用时,小明都会自己崩溃

如上,用代码表现出来就是

class SuperGreenManXiaoMing(SuperManXiaoMing):def __init__(self, relationship):super(SuperGreenManXiaoMing,self).__init__(relationship)self.__goOut_times = 0def goOut(self):self.__goOut_times+= 1if self.__goOut_times < 3:return "心情不好,憋说话!%s"%self.relationshipelse:return Exception("感受我社会主义愤怒的绿色小拳拳吧")def loveToWife(self):wife = 0love = 999.99print "阿芳,额对你的爱有 %s 深"%(love/wife)

实际调用效果如下:

    green = SuperGreenManXiaoMing("brother")print green.goOut()print green.goOut()g =  green.goOut()print isinstance(g, Exception)print g# ------------output----------
# 心情不好,憋说话!brother
# 心情不好,憋说话!brother
# True
# 感受我社会主义愤怒的绿色小拳拳吧
green.loveToWife()
# ------------output----------
# Traceback (most recent call last):
#   File "/Users/Silence/Documents/xiaoming.py", line 110, in <module>
#     green.loveToWife()
#   File "/Users/Silence/Documents/xiaoming.py", line 75, in loveToWife
#     print "阿芳,额对你的爱有 %s 深"%(love/wife)
# ZeroDivisionError: float division by zero

可以看出:

  • loveToWife()函数是class内部异常,只能捕获兼容,不能任何规避;
  • goOut()由于是返回的一个Excetion对象,所以即可以在小于3次时规避,也后期进行兼容。

另外,goOut的异常返回还有一种书写方式,如下:

    def goOut(self):self.__goOut_times+= 1if self.__goOut_times < 3:return "心情不好,憋说话!%s"%self.relationshipelse:raise Exception("感受我社会主义愤怒的绿色小拳拳吧")

这种写法,会将Exception直接抛出给最上层调用方,执行效果如下

    green = SuperGreenManXiaoMing("brother")print green.goOut()print green.goOut()g =  green.goOut()# ------------output----------
# 心情不好,憋说话!brother
# 心情不好,憋说话!brother
# Traceback (most recent call last):
#   File "/Users/Silence/Documents/xiaoming.py", line 108, in <module>
#     g =  green.goOut()
#   File "/Users/Silence/Documents/xiaoming.py", line 71, in goOut
#     raise Exception("感受我社会主义愤怒的绿色小拳拳吧")
# Exception: 感受我社会主义愤怒的绿色小拳拳吧

在上述三种异常的表现方式,区别在于:

异常表现 严重级别 友好度 使用场景
return Exception() 多参数返回时,作为协议中正确字段的返回
raise Exception() 对于正常业务流中的异常,不做完善兼容,完全寄希望于调用方来兼容
1/0(也可以称呼为code Exception) 代码bug

类的异常调用与兼容

  • return Exception

    • 接口协议中的一个正常字段,正常判断就可以
class SuperGreenOldManXiaoMing(SuperGreenManXiaoMing):"""docstring for SuperGreenManXiaoMing"""def __init__(self, relationship):super(SuperGreenOldManXiaoMing, self).__init__(relationship)def goOut(self):if self.relationship in ["sister","brother","parent"]:return "你们牛逼,听你的", Noneelif self.relationship in ["wife", "girlfriend"]:return "", Exception("憋跟我说话")else:return "滚粗", Exception("不想理你们") old = SuperGreenOldManXiaoMing("sister")
out, e = old.goOut()
if not e:print "小明没有揍我,哈哈哈"
else:print "小明揍我了",e

  • Raise Exception

    • 直接抛出一个异常,如果调用方比较坑,不想兼容,则会出现互相坑的情况;
    • 调用方通常会为了这个写一堆try…except…
class SuperGreenBoringManXiaoMing(SuperGreenManXiaoMing):"""docstring for SuperGreenManXiaoMing"""def __init__(self, relationship):super(SuperGreenBoringManXiaoMing, self).__init__(relationship)def goOut(self):if self.relationship in ["sister","brother","parent"]:return "你们牛逼,听你的"else:raise Exception("不想理你们")boring = SuperGreenBoringManXiaoMing("boss")
try:b = boring.goOut()
except:print "我挡!小明想揍我,可惜没揍到"pass

  • code Exception

    • 直接提bug修改吧

自定义异常

异常类和错误类,一句话概括为:包含错误文本信息的特殊class结构

目前python中所有的Error、Exception都继承自BaseException,而我们常用的Exception则指所有常见错误的基类,不包括语法错误等。

为什么要自定义异常?

  • 虽然小明被绿了以后,除了兄弟姐妹父母外,别人的话都听不进去,但是,不同的人说话还是有区别的

    • 交情好的人,小明可以选择耐着性子听听
    • 交情一般的人,小明会给一些眼神和委婉的表达
    • 没交情甚至落井下石的人,小明会直接上手揍了

对于听不进去的情形,我们都可以标记为Exception,但是不同的场景,Exception的处理是不一样的

代码解释为:

class RelationGoodError(Exception):def __init__(self, value):self.value = valuedef __str__(self):ming = SuperGreenManXiaoMing("friend")ming.age = 42return "道理我都懂,但是能不能过去还是得看自己啊"class RelationNormalError(Exception):def __init__(self, value):self.value = valuedef __str__(self):return "给你们一个让我安静的眼神,自己体会"class RelationBadError(Exception):def __init__(self, value):self.value = valuedef __str__(self)return "来呀,感受下我心中的愤怒吧!"class SuperGreenBoringManXiaoMing(SuperGreenManXiaoMing):def __init__(self, relationship):super(SuperGreenBoringManXiaoMing, self).__init__(relationship)def goOut(self): if self.relationship in ["sister","brother","parent"]:raise RelationGoodError("你们牛逼,听你的")elif self.relationship in ["friend", "classmates"]:raise RelationNormalError("不想理你们")else:raise RelationBadError("接受社会主义绿色小拳头吧!")     boring = SuperGreenBoringManXiaoMing("boss")
try:b = boring.goOut()
# except 可以多个,用于区分不同的Error
# 同一个except 里面,可以汇总多个Exception,都使用一种处理结果
except RelationGoodError, RelationNormalError:print "我挡!小明想揍我,可惜没揍到"
except RelationBadError, e:print "我擦,真揍我!"print e
finally:print "其实,小明有个美满的家庭了现在,日子很幸福"

 

转载于:https://www.cnblogs.com/SilenceCity/p/pythonOO2.html

python面向对象(其二)相关推荐

  1. python面向对象的优点_Python面向对象编程——总结面向对象的优点

    Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...

  2. 这可能是Python面向对象编程的最佳实践

    作者 | 崔庆才 来源 | 进击的Coder(ID:FightingCoder) Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了 ...

  3. 第八课.Python面向对象(二)

    类的继承和多态 继承和多态与函数有共同的目的,都是为了减少代码的冗余,提高复用的效率: 根据"Python面向对象(一)"的笔记,我现在定义一个Cinema类: #父类 class ...

  4. Python面向对象编程:类继承和其衍生术语

    Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...

  5. 《Python面向对象编程指南》——1.2 基类中的__init__()方法

    本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...

  6. Python 面向对象 基础

    编程范式概述: 面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实 ...

  7. python面向对象类属性_python面向对象之类属性和类方法案例分析

    本文实例讲述了python面向对象之类属性和类方法.分享给大家供大家参考,具体如下: 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 使用面相对象开发, ...

  8. 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

    前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...

  9. python对象编程例子-这是我见过最详细的Python面向对象编程!建议收藏!

    原标题:这是我见过最详细的Python面向对象编程!建议收藏! 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 ...

  10. python面向对象编程的优点-Python面向对象编程——总结面向对象的优点

    Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...

最新文章

  1. 【趋势】未来十年计算机体系结构的历史和趋势
  2. 理解 Word2Vec 之 Skip-Gram 模型【全】
  3. 99.Shell脚本自启程序并监控(实现全自动监控服务)
  4. CentOS谢幕,Anolis OS的无限可能
  5. at24c16如何划分出多个读写区_漫话:如何给女朋友解释为什么Windows上面的软件都想把自己安装在C盘...
  6. linux安装opencv让输入密码,linux下安装opencv的全过程(对初学者或者linux不熟悉的童鞋,非常适合)...
  7. 运维测试工作笔记0004---各种免费开源的测试平台
  8. 猴子数据让你深刻了解微信富媒体
  9. python飞机大战游戏素材_python实现飞机大战小游戏
  10. 将哔哩哔哩手机端缓存视频导出为正常mp4视频.
  11. JS中监听事件的写法
  12. 微信小程序 自定义控件 数字键盘
  13. 基于时间序列特征提取的车载网络系统入侵检测技术
  14. 兄弟连 linux 学习记录
  15. element表格分页功能
  16. word中如何批量更新题注(域)
  17. 08.数据结构:第一个动态结构-链表
  18. 泛微e-office怎么样?
  19. WebOffice常用API接口使用手册教程
  20. Python bytes转换为string

热门文章

  1. WebLogic—发布Web项目
  2. Element-UI中Select选择器讲解(el-select详解)
  3. win10鼠标右键拓展(使用vs Code打开)
  4. 超详细汇总21个mysql优化实践【收藏版MySQL优化】
  5. Windows中安装Electron说明
  6. GitStats-Git历史统计信息工具(转载)
  7. MySQL 字段操作命令
  8. 46. 考虑使用函数对象而不是函数作为STL算法的参数
  9. koa2 引擎模版html,Koa2模板引擎Ejs使用教程
  10. python如何获取权限_python 权限系统设计