【问题标题】:Python - Try-except loop - Referencing time delay as exceptionPython - Try-except 循环 - 将时间延迟作为异常引用
【发布时间】:2014-03-30 08:53:10
【问题描述】:

我正在尝试编写一个 try-except 循环,以在网页加载失败时刷新网页。这是我到目前为止所做的:

driver.get("url")

while True:
    try:
        <operation>
    except:
        driver.refresh()

我想设置这个循环,以便如果 5 秒后没有执行操作(可能是因为页面没有加载),它会尝试刷新页面。我们可以在except 中加入一个捕获时间延迟的异常吗?

【问题讨论】:

标签: python selenium try-except


【解决方案1】:

我会推荐阅读这篇文章Timeout function if it takes too long to finish

它的要点是您可以使用信号来中断代码并引发错误,然后您可以捕获该错误。

在你的例子中:

def _handle_timeout(signum,frame):
    raise TimeoutError("Execution timed out")

driver.get("url")
signal.signal(signal.SIGALRM, _handle_timeout)   

while True:
    try:
        signal.alarm(<timeout value>)
        <operation>
        signal.alarm(0) 
    except:
        driver.refresh()

您可以使用以下 sn-p 进行测试:

import time
import signal

def _handle_timeout(signum,frame):
    raise TimeoutError("Execution timed out")

def test(timeout,execution_time):
    signal.signal(signal.SIGALRM, _handle_timeout)
    try:
        signal.alarm(timeout)
        time.sleep(execution_time)
        signal.alarm(0)
    except:
        raise
    else:
    print "Executed successfully"

execution_time &gt; timeout 时会报错。

Python signal don't work even on Cygwin? 中所述,上述代码将无法在 Windows 机器上运行。

【讨论】:

  • 谢谢,这是有道理的。但是,我无法让 signal.SIGALRM 在 Python 3.3.4 上运行。我得到AttributeError: 'module' object has no attribute 'SIGALRM'
  • 在答案中添加了一行,因为这对其他人来说也很重要。
  • 另外,这篇博文是该主题的必读文章:eli.thegreenplace.net/2011/08/22/…
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 2016-04-06
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多