在while循环中处理异常

4
我将翻译成中文,以下是要翻译的内容:

我正在调用一个函数,如果网页还没有加载完成,它将引发一个异常。我想等待2秒钟,然后再尝试,直到页面加载完成。

我尝试过这样:

while(True):
    try:
        some_function()
        break
    except:
        time.sleep(2)

但是它在第一次迭代后就逃脱了。

如果异常没有被触发,我该如何退出循环?


因为你可能在有效的网页上调用它。 - Eli Sadoff
无论 some_function() 返回什么值,这段代码只会执行一次。 - Ma0
1
@Ev.Kounis:除非出现异常。 - Scott Hunter
你验证过 some_functiont 的正确性了吗? - Scott Hunter
@ScottHunter 是的,如果我设置更长的延迟,比如30秒,它就可以工作了。但是如果没有必要,我不想等那么久。 - Luis Ramon Ramirez Rodriguez
5个回答

11

尝试像这样做:

def some_function(){
    try:
        #logic to load the page. If it is successful, it will not go to except.
        return True
    except:
        #will come to this clause when page will throw error.
        return False
    }
    
while(True):
    if some_function():
        break
    else:
        time.sleep(2)
        continue

@Ev. Kounis:看到您的建议了。但我认为 while 内不需要 flag == True。即使它是无限循环,在 while 内部的 if 语句会使其停止。因此,检查 flag 就足够了!请您提出建议! - Deca
为什么要初始化它,如果它只返回已经存在的文本呢? - Ma0
在顶部...最上面的一行正在初始化标志! - Deca
但是为什么呢?在您的代码版本中不需要它。 - Ma0
不明确声明 flag 为任何布尔类型也可以工作……当返回值是 True/False 时,这样做只是为了让它更简单! :) - Deca
1
这个答案中没有人提到花括号? :o - Break

4
为什么不用这个:
res = False
while (res == False):
    time.sleep(2)
    try:
        some_function()
        res = boolean(some_function())
    except:
        continue

1

try块中的所有内容都将被执行,直到出现异常,此时将调用except块。

因此,在第一次迭代期间中断了。

我认为你的意思是:

while(True):
    try:
        some_function()
    except:
        time.sleep(2)
        break

当异常被引发时,while循环将会被中断。

如果异常没有被触发,我该如何跳出? - Luis Ramon Ramirez Rodriguez
1
我的理解是他想一直尝试,直到“尝试”成功。 - Ma0

-1

移除break语句。Break语句的作用是在第一次循环后退出循环块。


1
真实的故事,但这不是唯一的问题。必须有某种退出策略,否则这将永远运行下去。 - Ma0
1
他只是问为什么在第一次循环后它就跳出了。 - kiran_raj_r

-1

这是因为如果你使用break,它会跳出while循环。去掉break并缩进except。

while(True):
    try:
        some_function()
        if check_loaded:
            break
    except:
        time.sleep(2)

“check_loaded” 是什么? - Ma0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接