如何在 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
...
有没有办法不将所有 getter 都包装在 try/except 中?如果是这样的注释就好了:
@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")
这样,您就不会以 catching/silencing 编程 错误告终——这些错误仍然会出现,您可以在日志中或任何它们出现的地方查看它们收到报告,您可以返回并修复它们。
我有很多这样的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
...
有没有办法不将所有 getter 都包装在 try/except 中?如果是这样的注释就好了:
@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")
这样,您就不会以 catching/silencing 编程 错误告终——这些错误仍然会出现,您可以在日志中或任何它们出现的地方查看它们收到报告,您可以返回并修复它们。