zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    21.栈的压入、弹出序列(python)
    19.顺时针打印矩阵(python)
    18.二叉树的镜像(python)
    [leetcode] 82. 删除排序链表中的重复元素 II
    [leetcode] 83. 删除排序链表中的重复元素
    [leetcode] 81. 搜索旋转排序数组 II
    [leetcode] 80. 删除排序数组中的重复项 II
    [leetcode] 208. 实现 Trie (前缀树)(Java)
    [leetcode] 212. 单词搜索 II(Java)
    [leetcode] 79. 单词搜索
  • 原文地址:https://www.cnblogs.com/ankier/p/2829118.html
Copyright © 2011-2022 走看看