我正在使用Google App Engine(GAE)上的python statsd library。不幸的是,當使用套接字時,GAE可能不時地增加ApplicationError: 4 Unknown error.
。該錯誤是apiproxy_errors.ApplicationError
。如果裝飾器函數在庫中,我不能修改,我應該如何捕獲裝飾器函數中可引發的異常?
statsd客戶端已經設置爲捕獲socket.error
,但不是插座可以在GAE上引發的ApplicationError
。 https://github.com/jsocol/pystatsd/blob/master/statsd/client.py#L13
的Timer
的__call__
方法允許將其用作裝飾,像這樣::
from statsd import StatsClient statsd = StatsClient() @statsd.timer('myfunc') def myfunc(a, b): """Calculate the most complicated thing a and b can do."""
我
我具體地說timer
,它返回的Timer
實例工作沒有簡單的修改Timer.__call__
方法本身的能力,也簡單地趕上ApplicationError
。
我該如何編寫一個包裝或附加裝飾器,它仍然允許像@my_timer_wrapper('statsd_timer_name')
這樣的乾淨裝飾,但是會捕獲可能在包裝/裝飾的timer
方法中出現的其他異常?
這是在我的代碼庫中的基礎模塊,將在許多地方使用(無論我們想要什麼時間)。因此,雖然this SO answer可能工作,但我真的希望避免強制在我的代碼庫中使用@statsclient.timer
自己在try-except
塊中定義它們。
我想在做類似的以下內容:
def my_timer_wrapper(wrapped_func, *args, **kwargs): @functools.wraps(wrapped_func) class Wat(object): def __call__(self, *args, **kwargs): timer_instance = stats_client.timer(*args, **kwargs) try: return timer_instance.__call__(wrapped_func)(*args, **kwargs) except Exception: logger.warning("Caught exception", exc_info=True) def foo(): pass return foo return Wat()
這將然後像使用:
@my_timer_wrapper('stastd_timer_name') def timed_func(): do_work()
是否有更好或更Python的方式?
看起來像那個類可以用作上下文管理器,而不是在try/except中換行。 –
你可以猴子補丁statsd。在appengine_config.py中執行修補,因此只需在代碼庫中執行一次即可。 –