【问题标题】:try-block not working when function is used as argument当函数用作参数时,try-block 不起作用
【发布时间】:2019-09-18 10:22:44
【问题描述】:

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

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

【问题讨论】:

  • 实际计算发生在一个func1。所以使用func1上的异常处理程序@
  • 在func1中使用try except,因为func2只会返回func1的输出,不需要try-except。
  • 这就是我在func3 中所做的。但是,我有许多类似于func1 的功能,它们都应该以相同的方式处理(即通过func2

标签: python function exception return try-catch


【解决方案1】:

如果您必须将检查放入func2,则需要确保计算发生在func2 中。在你的情况下,电话是func2(func1(1,0))。所以幕后发生的事情是,当func2 调用func1(1,0) 时,它没有计算其中的func1,而是取func(1,0) 的值,即它要求func1 执行它在它自己的范围内计算,并且只返回值。 func1 在没有进入func2Try 块的情况下遇到ZeroDivisionError。您的实际函数调用变为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)

【讨论】:

    【解决方案2】:

    你写错了func2 并且叫错了。

    试试这个:

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

    然后这样称呼它:

    func2(lambda:func1(1,2))
    

    更新:

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

    【讨论】:

      【解决方案3】:

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

      你可以试试:

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

      【讨论】:

      • 你的func2() 什么都不做!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 2021-04-05
      • 1970-01-01
      • 2013-02-26
      • 2014-12-14
      • 1970-01-01
      相关资源
      最近更新 更多