python - 当函数用作参数时,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 调用的代码,有时会返回连接错误。我想将所有这些调用放在一个函数中,该函数会在几秒钟后尝试重试。
解决方案
如果您必须签入func2
,则需要确保计算发生在内部func2
。在你的情况下,电话是func2(func1(1,0))
. 所以幕后发生的事情是,当func2
调用时func1(1,0)
,它不计算它的func1
内部,而是取 的值func(1,0)
,即它要求func1
在自己的范围内进行计算,并且只返回值。func1
遇到 aZeroDivisionError
而没有进入 的Try
块func2
。您的实际函数调用变为func2(return_val_of_func1(1,0))
. 因此,您实际上是在检查func1
throws 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)
推荐阅读
- unity3d - 如何在 Blazor 的 Unity 中打开为 WebGL 编译的游戏?
- r - R:基于不是一列而是两列的值的颜色标记
- java - 防止通知被自动隐藏
- python - 如果在 Django 模板中出现条件,如何使用 Django 模板?
- c - 为什么我得到 s=-1807786450?
- pytorch - 如何在pytorch中有效地重复时间的张量元素变量?
- python - 比较两个时间列,然后在 python 数据帧的新列中返回 hh:mm:ss 中的最小时间差
- ruby - Codewars:“返回或旋转”:为什么我尝试的解决方案不起作用?
- bash - 使用 Docker,如何在 Dockefile 中更改 bash 版本?
- linux - 有没有办法在 zsh 中使用 autocd 切换到目录后自动 ls ?