python 实现简单的ExceptionCallHandler装饰器

Python的functools模块, 提供了3个有趣函数, partial, update_wrapper 和wraps 。

partial函数,它可以重新绑定函数的可选参数,生成一个callable的partial对象。

update_wrapper函数,把被封装函数的__name__、__module__、__doc__和 __dict__都复制到封装函数去。

wraps函数,对update_wrapper更进一步封装。

可以利用wraps函数,实现简单的方法拦截机制,来实现自己的ExceptionCallHandler,

具体实现:

#-*- coding: UTF-8 -*-
#-------------------------------------------------------------------------------
# Name:        模块2
# Purpose:
#
# Author:      ankier
#
# Created:     22-12-2012
# Copyright:   (c) Ankier 2012
# Licence:     <2012~2020>
#-------------------------------------------------------------------------------
import time

from functools import wraps

_Cache ={}

def ExceptionCallHandler():
    def _ExceptionCallHandler(fun):
        @wraps(fun)
        def wrap(args, kw):
            glos = fun.func_globals
            package = glos['__package__']
            model = glos['__name__']
            methodName = fun.func_name
            
            result = None
            try:
            
                result = fun(args, kw)               
            
            except Exception, e :            
            
                print 'package:',package,' , model:', model, ' , methodName:',methodName,'. ', e
            
            return result 
        return wrap
    return _ExceptionCallHandler
#-*- coding: UTF-8 -*-

import time
from exceptionCallHandler import ExceptionCallHandler

@ExceptionCallHandler()
def Sum(xx , yy ):
    raise Exception("Exception error information!")    
    sum = xx + yy
    print '------sum----- '
    time.sleep(10)            
    return sum

print Sum(4, 5)

print Sum(4, 5)

运行效果:

package: None , model: mainFrame , methodName: Sum . Exception error information!
package: None , model: mainFrame , methodName: Sum . Exception error information!

原文地址:https://www.cnblogs.com/ankier/p/2829118.html