Python反射异常处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python反射异常处理相关的知识,希望对你有一定的参考价值。
反射
:字符串到对象属性的映射
hasattr(obj,string),
判断对象obj里面是否有叫string的字段或方法
getattr(obj,string)
获取obj对象里名叫string的字段或方法(如果重名先找字段)
setattr(obj,y,v)
设置属性或者方法obj.y = v
delattr(obj,y)
删除属性obj.y
class Dog(object): def __init__(self,name): self.name = name def eat(self): print("%s is eating"%self.name) d = Dog("labuladuo") choice = input(">>").strip() #用户输入什么调用什么方法,用反射 def bulk(self): print("%s is bulking"%self.name) if hasattr(d,choice): func = getattr(d,choice) func() #删除属性 delattr(d,choice) else: #动态添加一个方法d.choice = bulk setattr(d,choice,bulk) d.bulk(d) #动态添加一个属性,如果该属性存在会报错 setattr(d,choice,None) print(getattr(d,choice))
反射为什么重要?
动态的实现内存装配,通过字符串反射到内存对象,不用写一大堆if..else判断用户输入什么调用什么方法了,直接用反射
异常处理
Python中有很多异常,有的异常不能通过编译,例如:indentationError 这个不能catch
低级版:抓住全部错误。不要这样用,自己搞着玩可以
try: names[3] data["name"] except Exception as e: print("出错:",e)
正常版:预料一些错误。一般的使用方式
try: names[3] data["name"] except KeyError as e: print("没有该key",e) except IndexError as e: print(e)
正常版低级形态:不知道是哪句代码出错,可以统一处理
try: names[3] data["name"] except (KeyError,IndexError) as e: print("错误",e)
终极出错大套餐:基本考虑各种情况,但是Exception不能catch缩进异常
try: names[3] data["name"] open("aa.txt") except KeyError as e: print("没有该key",e) except IndexError as e: print("下标越界",e) except Exception as e: print("未知错误:",e) else: print("一切正常") finally: print("不管有没有错,都执行")
自定义异常,例如别人调你的接口,别人触发你定义的异常
以上是关于Python反射异常处理的主要内容,如果未能解决你的问题,请参考以下文章
Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)
(转)Python自动化运维之13异常处理及反射(__import__,getattr,hasattr,setattr)