2013-04-04 48 views
1

在下面的示例代碼中,我打算獲取裝飾函數的被調用者的堆棧幀。假設,裝飾函數power(below)調用pwr函數,並且有一個例外,我想爲pwr獲取堆棧框架(打印函數參數)。對於在API中暴露的函數,它的參數和響應是打印出來的,但是模塊內部的函數和api調用的函數,我希望得到這些堆棧幀。在異常情況下獲取函數的堆棧幀

import inspect 
def api(func): 
    def decor(*args, **kwargs): 
     try: 
      print "Request %s %s %s" % (func.__name__, args, kwargs) 
      response = func(*args,**kwargs) 
      print "response %s", response 
      return response 
     except Exception, e: 
      print "exception in %s", func.__name__ 
      for frame in inspect.stack(): 
       print frame[3] 
      raise e 
    return decor 

@api 
def power(a,b): 
    return pwr(a,b) 

def pwr(): 
    ... 
    ... 

當我運行代碼,在例外期間,我從裝飾和up但不是func或更低的堆棧幀。任何人都可以建議

回答

0

在函數返回或引發之後無法訪問框架,並且由於框架不再存在而導致出現異常。如果您真的想訪問功能框架以用於某些調試/分析目的,並且無法修改該功能,請考慮使用sys.setprofilesys.settrace。該回調將作爲參數傳遞給框架。

+0

由於@bereal,我想我有與滿足。 – Neil 2013-05-14 07:03:30

1

如果您想查看發生異常的上下文,則需要查看從sys.exc_info()返回的第三個值(「回溯對象」)。 traceback module有一些有用的功能來處理這些對象:您可能可以使用traceback.print_tb

例如:

>>> import sys, traceback 
>>> try: raise Exception() 
... except: traceback.print_tb(sys.exc_info()[2]) 
... 
    File "<stdin>", line 1, in <module> 
相關問題