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反射异常处理

Python----面向对象异常处理反射单例模式

(转)Python自动化运维之13异常处理及反射(__import__,getattr,hasattr,setattr)

Python入门自学进阶——7--类与对象-异常反射单例模式

反射-异常处理-单例模式