一个 Python try/except 函数来统治它们(使用不同的输入)是可能的吗?

A Python try/except function to rule them all (with different inputs) is possibile?

我试图在 Python 中定义一个 try/except 函数,它可以处理各种其他函数。 这个想法是这样的:

def func1(x,y):
    z = x+y
    return z
    
def error_check(func1):
    try: stuff = func1()
    except: 
        print('Error')     
    return stuff
    
error_check(func1('1',2))

在这种情况下,使用这些输入,error_check 函数甚至不起作用。 目的是我可以将 error_check 与另一个具有不同输入数量的 func2 一起使用。例如:

def func2(w,x,y):
    z = w+x+y
    return z

这可能吗?

非常感谢

您的问题是,在最后一行中,您实际上是在调用 func1,然后在结果上调用 error_check。尝试这样的事情,其中​​ lambda 延迟评估直到 try 块,就像我们想要的那样:

def func1(x,y):
    z = x+y
    return z
    
def error_check(func1):
    try:
        stuff = func1()
        return stuff
    except: 
        print('Error')     
        return None
    
error_check(lambda: func1('1',2))

你也有一个错误,如果 try 块失败,stuff 是未定义的,所以我冒昧地修复了它。

整个想法的核心问题是捕获错误并不意味着您修复了错误。只需使用引发异常的 func1 尝试您的函数,您就会看到问题所在:

>>> def error_check(func1):
...     try:
...         stuff = func1()
...     except:
...         print('Error')
...     return stuff
...
>>> def oops():
...     raise ValueError
...     print("Computing the answer...")
...     return 42
...
>>> error_check(oops)
Error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in error_check
UnboundLocalError: local variable 'stuff' referenced before assignment

请注意,我们在输出中没有看到 Computing the answer...,我们的函数也没有看到 return 42! 我们在 error_check 中无法改变这一点。

问题是,如果 func1 引发异常,它不会 return 任何东西。因此没有stuff到return。您不能仅仅通过忽略它引发的异常来强制函数“工作”;如果函数引发异常,则意味着 它无法完成它应该做的事情

也许您对此没有意见,并希望您的 error_check 变为 return None,而不是 func1 应该 return 的任何东西。如果是这样,你可以这样做:

def error_check(func1):
    try:
        return func1()
    except Exception as e:
        print(f"Error")

如果有异常,这将隐含地 return None。它不会引发另一个异常,但是 func1 仍然不会做它应该做的事情:

>>> error_check(oops)
Error
>>>

请注意,如果我们的程序中的其他东西需要 42 值,那个 东西现在可能会引发错误,如果你发现了error,it 之后的东西会引发错误,依此类推。最终,仅仅捕获错误并忽略它们不会给自己带来任何好处。

综上所述,如果您希望能够将其他参数传递给 func1,请使用 *args**kwargs:

def error_check(func1, *args, **kwargs):
    try:
        return func1(*args, **kwargs)
    except Exception as e:
        print(f"Error: {e}")

现在你可以做:

error_check(func1, '1', 2)

func1 将在 error_check 内调用,其中 *args('1', 2)