在异常情况下重复调用Python函数?

11 投票
7 回答
12586 浏览
提问于 2025-04-16 10:25

大家好,我正在做一个数据抓取的项目,想找个简单的方法来重复调用一个函数,如果出现了异常的话。

伪代码:

try:
    myfunc(x)
except myError:
    ###try to call myfunc(x) again Y number of times, 
        until success(no exceptions raised) otherwise raise myError2

我知道这样做并不是最佳实践,但我正在处理一些不太可靠的代码和网络层,实际上我也没法调试它们。

现在我用了一大堆try\except块来实现这个功能,搞得我眼睛都快受不了了。

有没有更优雅的想法呢?

7 个回答

4

这段内容是关于编程问题的讨论,涉及到一些技术细节。虽然我不能直接回答问题,但我可以帮你理解其中的内容。

在编程中,有时候我们会遇到一些错误或者问题,这些问题可能是因为代码写得不够好,或者是使用的工具不合适。大家在讨论的时候,通常会分享他们的经验和解决方法,这样可以帮助其他人更快地找到答案。

如果你在学习编程,遇到不懂的地方,记得多问问题,看看别人是怎么解决的。这样你会学到很多东西,也能提高自己的编程能力。

总之,编程是一门需要不断学习和实践的技能,遇到问题是很正常的,关键是要保持好奇心和耐心。


for x in xrange(num_retries):
    try:
        myFunc()
    except MyError, err:
        continue
        #time.sleep(1)
    err = None
    break
if err:
    raise MyError2
#else:
#    print "Success!"


8

使用循环

i = 0
while True:
  try: myfunc(x); break;
  except myError:
    i = i + 1;
    # print "Trying again"
    if i > 5: raise myError2;
13

为了实现你想要的效果,你可以尝试下面的做法:

import functools
def try_x_times(x, exceptions_to_catch, exception_to_raise, fn):
    @functools.wraps(fn) #keeps name and docstring of old function
    def new_fn(*args, **kwargs):
        for i in xrange(x):
            try:
                return fn(*args, **kwargs)
            except exceptions_to_catch:
                 pass
        raise exception_to_raise
    return new_fn

接下来,你只需要把旧的函数放在这个新函数里面:

#instead of
#risky_method(1,2,'x')
not_so_risky_method = try_x_times(3, (MyError,), myError2, risky_method)
not_so_risky_method(1,2,'x')

#or just
try_x_times(3, (MyError,), myError2, risky_method)(1,2,'x')

撰写回答