可以編寫一個通用的捕獲異常的裝飾器, 當程序發生異常時可以繼續執行后續動作。 尤其適合於使用大量斷言的驗證性程序。
裝飾器的實現原理使用了回調技術。
如下所示, 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.'