【问题标题】:How to auto wrap function call in try / catch?如何在try / catch中自动包装函数调用?
【发布时间】:2017-02-15 18:04:57
【问题描述】:

我有很多这样的 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")

谢谢

【问题讨论】:

标签: python


【解决方案1】:

可以通过编写自己的装饰器来做到这一点:

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")

这样,您最终不会捕获/消除编程错误——这些错误仍会出现,您可以在日志中或报告的任何地方查看它们,然后您可以返回并修复它们。

【讨论】:

    猜你喜欢
    • 2018-08-23
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多