首页 > 解决方案 > 当函数用作参数时,try-block 不起作用

问题描述

我有一个函数,我传递给另一个函数:

def func1(a, b):
    return a/b

第二个函数旨在处理类似于引发的异常func1

def func2(func):
    try:
        return func
    except ZeroDivisionError as e:
        print("0")

如果我通过

func2(func1(1,2))

0.5正如预期的那样,输出是。但是,func2(func1(1,0))引发了一个ZeroDivisionError未被except语句捕获的:

---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input> in <module>
----> 1 func2(func1(1,0))

<ipython-input> in func1(a, b)
      1 def func1(a, b):
----> 2     return a/b

ZeroDivisionError: division by zero

谁能澄清为什么在这个例子中没有输入 except 块?

def func3(a,b):
    try:
        a/b
    except ZeroDivisionError as e:
        print("0")

正如预期的那样,输入func3(1,0)返回。0

背景:我有一个包含多个 API 调用的代码,有时会返回连接错误。我想将所有这些调用放在一个函数中,该函数会在几秒钟后尝试重试。

标签: pythonfunctionexceptionreturntry-catch

解决方案


如果您必须签入func2,则需要确保计算发生在内部func2。在你的情况下,电话是func2(func1(1,0)). 所以幕后发生的事情是,当func2调用时func1(1,0),它不计算它的func1内部,而是取 的值func(1,0),即它要求func1在自己的范围内进行计算,并且只返回值。func1遇到 aZeroDivisionError而没有进入 的Tryfunc2。您的实际函数调用变为func2(return_val_of_func1(1,0)). 因此,您实际上是在检查func1throws any的值ZeroDivisionError,这是不可能的。因此,您可以做的是:

def func1(a, b):
    return a/b

def func2(func1,a,b):
    try:
        return func1(a,b)
    except ZeroDivisionError as e:
        print("0")

func2(func1,1,0)

推荐阅读