1 try: 2 raise testError() //实例化自定义异常类,后面括号可传入参数 3 except testError,e: 4 print e
2.4 finally
不管try子句是否发生异常都会执行,比如当你在读写文件或者scoket通讯时,不管是否出现异常都应该在结束后关闭文件或者网络套接字,这时就可以把关闭方法放在finally子句中
1 try: 2 f = open("test.txt","a") 3 f.write(data) 4 except Exception,e: 5 print e 6 finally: 7 f.close()
2.5 忽略所有异常1 try: 2 Garen = Hero 3 except: 4 pass
这是一种比较危险的用法,它会忽略程序的所有异常而继续的让程序执行下去。
异常处理只需要记住一点:当我们知道某段代码可能会导致某种异常,但我们又不希望程序停止,那么我们就可以根据需要添加异常处理。
扩展:反射中的getattr的内部实现也是通过访问特性并捕捉可引发的AttributeError异常区实现的
反射
反射,将名称转换成动词,这是笔者看完《Execution in the Kingdom of Nouns》后对反射的第一反应,大家有兴趣可以去翻阅,一篇不算太长的文章。
下面我们来想象一下这么一个场景:你坐在电脑旁,玩着LOL,通过鼠标和键盘传递信息,游戏里的英雄相应的做出操作,这就可以看成反射。这是怎么做到的呢?让我们往下看:
首先我们定义了一个英雄模板,也就是基类。
1 class Hero: 2 def __init__(self): 3 self.ATK = 30 4 self.DEF = 10 5 self.HP = 300 6 self.MP = 100 7 8 def walk(self): 9 print "你的英雄正走向目标" 10 def running(self): 11 print "你的英雄正跑向目标" 12 def skills(self): 13 print "你的英雄正在释放技能" 14 def attack(self): 15 print "你的英雄正在攻击"
上面这个英雄基类里有攻击、防御、生命和魔法值四个属性以及走路、跑步、释放技能和攻击四个方法动作。
现在你在电脑前创建了一个角色盖伦,程序开始把类实例化:
1 Garen = Hero()
OK,你的英雄角色已经生成了,让我们看看盖伦现在都有什么(前面四个是属性,后面四个是方法,中间我们先不管它):
1 print dir(Garen) 2 3 C:\Python27\python.exe D:/python/s11/8day/反射/test.py 4 5 ['ATK', 'DEF', 'HP', 'MP', '__doc__', '__init__', '__module__', 'attack', 'running', 'skills', 'walk']
再看看初始属性是多少(恩,HP比MP高,看来是近战英雄):
1 print Garen.__dict__ 2 3 C:\Python27\python.exe D:/python/s11/8day/反射/test.py 4 5 {'HP': 300, 'ATK': 30, 'DEF': 10, 'MP': 100}