![](/img/trans.png)
[英]Catch custom Exception that is raised by a function inside the 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
而不进入func2
的Try
块。 您的实际函数调用变为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.