繁体   English   中英

当函数用作参数时,try-block不起作用

[英]try-block not working when function is used as argument

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

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 ,该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调用的代码,有时会返回一个Connection错误。 我想将所有这些调用放在一个函数中,该函数会在几秒钟后尝试重试。

如果必须将检查放入func2 ,则需要确保计算在func2内部进行。 在您的情况下,调用为func2(func1(1,0)) 因此,在func2发生的事情是,当func2调用func1(1,0) ,它没有计算其中的func1 ,而是取了func(1,0)的值,即它正在要求func1进行操作在自己的范围内进行计算,并且仅返回值。 func1遇到ZeroDivisionError而不进入func2Try块。 您的实际函数调用变为func2(return_val_of_func1(1,0)) 因此,您实际上是在检查func1的值是否引发任何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)

您写的func2错误,并称之为错误。

尝试以下方法:

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

并这样称呼它:

func2(lambda:func1(1,2))

更新:

还要注意,如果没有ZeroDivisionError异常, func2将返回func()的返回值,但是当有异常时,它将返回None

func2将永远不会返回ZeroDivisionError,因为在try块中从未引发此错误。 在try块中,您只是返回func1的输出,它将永远不会引发错误。

你可以试试:

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


def func2(func):
    return func

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM