[英]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.