我有很多像这样的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
...
Run Code Online (Sandbox Code Playgroud)
有没有办法在try/except中包装所有getter?如果它是某种类似的注释会很好:
@silent_exec(default=None)
def get_property_b():
self.data.get("field_2")[0].get("b")
Run Code Online (Sandbox Code Playgroud)
谢谢
您可以通过编写自己的装饰器来完成此操作:
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
Run Code Online (Sandbox Code Playgroud)
话虽如此,我会非常谨慎地使用它.您应该很少捕获所有异常(正如我们在此处所做的那样).通常你最好指定一个你实际期望的异常元组并知道如何处理...
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")
Run Code Online (Sandbox Code Playgroud)
这样,您最终不会捕获/沉默编程错误 - 这些错误仍然会被提升,您可以在日志中或在报告的任何位置查看它们,您可以返回并修复它们.