簡體   English   中英

如何在try / catch中自動包裝函數調用?

[英]How to auto wrap function call in try / catch?

我有很多像這樣的getter函數:

get_property_a(default=None):
  try:
     self.data.get("field_1")[0].get("a")
  except Exception as e:
     return default

get_property_b(default=None):
  try:
     self.data.get("field_2")[0].get("b")
  except Exception as e:
     return default

...

有沒有辦法在try / except中包裝所有getter? 如果它是某種類似的注釋會很好:

@silent_exec(default=None)
def get_property_b():
  self.data.get("field_2")[0].get("b")

謝謝

可以通過編寫自己的裝飾器完成此操作:

import functools

def silent_exec(default=None):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            try:
                return func(*args, **kwargs):
            except Exception:
                return default
        return wrapper
    return decorator

話雖如此,我會非常謹慎地使用它。 您應該很少捕獲所有異常(正如我們在此處所做的那樣)。 通常你最好指定一個你實際期望的異常元組並知道如何處理...

import functools

def silent_exec(exceptions, default=None):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            try:
                return func(*args, **kwargs):
            except exceptions:
                return default
        return wrapper
    return decorator

@silent_exec((IndexError, KeyError), default=None)
def get_property_b():
  self.data.get("field_2")[0].get("b")

這樣,您最終不會捕獲/沉默編程錯誤 - 這些錯誤仍然會被提升,您可以在日志中或在報告的任何位置查看它們,您可以返回並修復它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM