可以编写一个通用的捕获异常的装饰器, 当程序发生异常时可以继续执行后续动作。 尤其适合于使用大量断言的验证性程序。
装饰器的实现原理使用了回调技术。
如下所示, robust 是一个装饰器。 当在普通函数 func 加上 @robust 注解时, 即是给 func 加上了 robust 装饰。 当调用 func 时, 就会实际地执行 robust , 获取装饰后的函数 add_robust , 调用 add_robust 来完成实际的动作。 即调用: func(*arg, **keyargs) 等效于 robust(simple)(*arg, **keyargs)
#------------------------------------------------------------------------------- # Name: deco.py # Purpose: demo of decoration in python # # Author: qin.shuq # # Created: 27/10/2014 #------------------------------------------------------------------------------- import traceback def robust(actual_do): def add_robust(*args, **keyargs): try: return actual_do(*args, **keyargs) except: print 'Error execute: %s' % actual_do.__name__ #traceback.print_exc() return add_robust @robust def simple(): return 5 / 0 @robust def readFile(filename): f = open(filename, "r") print len(f.readlines()) f.close() def add(a,b): return int(a)+int(b) @robust def assertSumIsPositive(*args): sum = reduce(add, *args) assert sum >= 0 @robust def checkLen(**keyargs): if len(keyargs) < 3: raise Exception('Number of key args should more than 3.') if __name__ == '__main__': simple() readFile("UnexistFile.txt") assertSumIsPositive(1,2,-3,-4) checkLen(a=5,b=2) print 'Yet still reach here.'