【问题标题】:is there any better way try a function many times in python?有没有更好的方法在 python 中多次尝试一个函数?
【发布时间】:2011-08-19 09:29:03
【问题描述】:

test 发现这样的异常时,我想多次执行它

    try:
        test()
    except:
        try:
            test()
        except:
            try:
                test()
            except Exception,e:
                logger.info(e)

当我请求一个 url 并获得 url 响应时,这种情况会发生
因为当您请求一次时,Target Web 服务器可能会响应一些不良数据,
它有这么多词来做到这一点,而不是 pythonic 实现
有没有一些 Pythonic 风格可以做到这一点?

【问题讨论】:

标签: python try-catch


【解决方案1】:
for _ in range(5):
    try:
        test()
    except SomeError:
        pass
    else:
        break
else:
    #All tries failed, do something.
    logger.info(...)

【讨论】:

  • 改进了 Constantinius 的答案,仅在发生异常时循环,并且不捕获迭代计数(使用_),但您可以提高效率(尽管它对 for这样一个微不足道的大小)通过使用xrange——range实际上会实例化一个实际的列表,而不是一个迭代器,我不知道如果Python注意到你没有将它分配给任何东西,它是否真的优化了它
  • 这会执行 test() 五次吗?
  • @timger,这会尝试执行 test() 五次,如果 test() 每次都失败,则执行 else 子句。但是如果 test() 没有引发 SomeError,它会中断循环,跳过 else 部分并继续执行。
  • @hircus,在 Python 3 中,range 返回一个类似于 Python2 中的 xrange 的可迭代对象,所以我通常只使用 range。而Python并没有对其进行优化,_没有任何特殊含义,只是一个变量名。
  • @utdemir 最后一个“else”不能用“for”编译
【解决方案2】:
while True:
    try:
        test()
        break
    except Exception, e:
        logger.info(e)

查看Handling Exceptions 上的 Python 文档。

【讨论】:

    【解决方案3】:

    试试这个:

    for i in xrange(3):
        try:
            test()
        except Exception, e:
            if i == 3:
               # handle exception
               # ...
    

    【讨论】:

    • 我只想在发现异常时执行测试重复
    【解决方案4】:
    for i in range(3):
        try:
            test()
        except Exception, e:
            if i==2:
                logger.info(e)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 2010-10-08
      • 1970-01-01
      • 2012-07-08
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多