【问题标题】:How to perform error handling for 200 functions?如何对 200 个函数进行错误处理?
【发布时间】:2019-08-02 18:58:53
【问题描述】:

下面是一个示例函数

def temp(data):
    a = sample_function_1(data)
    a = a[0][0]
    b = sample_function_2(data,'no',0,30)
    b = b[-1]
    c = sample_function_3(data, 'thank', 0, None, 15, 5)
    c = c[-2]
    print(a, b, c)
    return a, b, c

对 sample_function_1、sample_function_2 和 sample_function_3 进行了错误处理。因此,这些函数返回的值没有问题,但对变量 a, b, c 进行的计算可能会引发错误。

这样的函数有 200 多个,我需要有效地管理错误。我知道 try, catch, except 是一种选择,但有什么方法可以解决这个问题。

【问题讨论】:

  • 听起来问题出在应用程序的整个结构上。如果你有 200 多个函数,而且所有函数的接口都略有不同,那将是完全不可读的。您能否提供更多背景信息?现在这似乎是一个 XY 问题。
  • @jonrsharpe 这 200 个函数与上面的函数类似,只是中间有一些细微的变化。基本上,我正在使用字符串,每个函数都解决了特定公司的特定任务。这行得通吗?
  • 什么“小改动”?什么“弦”?什么“特定任务”和“特定公司”?
  • @jonrsharpe 我正在对不同商店的发票进行文本挖掘。不同商店的格式不同。 sample_functions 是解决常见任务的实用函数。变量 a、b、c 需要对从 sample_functions 返回的值进行一些额外的处理。我能够处理来自 sample_functions 的错误,因为它们很常见,但我面临的问题是处理变量 a、b、c 的错误。这些变量 a、b、c 在 200 个函数中很常见,我不知道如何处理错误。这现在清楚了吗?

标签: python python-3.x error-handling try-catch python-decorators


【解决方案1】:

我认为您可以只定义一个函数,然后在任何函数的任何 except 块中调用 exception_logger 函数。

import traceback

def exception_logger():
    exception_log = traceback.format_exc().splitlines()
    exception_log.append(str(datetime.now()))
    print exception_log
    return exception_log

def hello():
    try:
        print("Hello World!")

    except Exception as e:
        exception_logger()

【讨论】:

  • 我有 200 个函数,比如你提到的 hello 函数。另外,我有 3 个变量 a、b、c,除了所有 3 个变量和 200 个函数之外,写尝试将是太多的手动工作
【解决方案2】:

使用 200 个函数来更改所有内容将是一项艰巨的工作,但您可以尝试使用装饰器,每个函数只能拦截一个错误,但这可能是您的情况的一个很好的折衷方案。

def exception_logger(func):
    wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except IndexError:
           ...doSomething...
           raise
    return wrapper

@exception_logger
def temp(data):
   ...doSomething...

【讨论】:

  • 这是个好主意,但它只拦截一个错误。有什么方法可以处理每个函数最多 3 个错误。我只想从异常记录器中返回 np.NaN
  • @DhavalThakkar 我不确定你所说的只有一个错误是什么意思。如果您的任何计算引发错误,它将捕获它,您可以从装饰器返回np.nan。它不会进一步执行您的功能,因此不会再引发任何异常。
猜你喜欢
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多