Python – цикл Try-except – ссылка на временную задержку как исключение

Я пытаюсь закодировать цикл try-except, который обновляет веб-страницу, если она не загружается. Вот что я сделал до сих пор:

driver.get("url")

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

Я хочу настроить этот цикл так, чтобы, если прошло 5 секунд и операция не была выполнена (предположительно, потому что страница не загрузилась), он попытался обновить страницу. Есть ли исключение, которое мы можем включить в except, которое улавливает временную задержку?


person user3294195    schedule 30.03.2014    source источник
comment
См. здесь: stackoverflow.com/ вопросы/8616630/   -  person ebarr    schedule 30.03.2014


Ответы (1)


Я бы рекомендовал прочитать этот пост Функция тайм-аута, если требуется слишком много времени для закончить.

Суть его в том, что вы можете использовать сигналы, чтобы прервать код и вызвать ошибку, которую вы затем поймаете.

В вашем примере:

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()

Вы можете проверить это с помощью следующего фрагмента:

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 > timeout.

Как отмечено здесь в сигнал Python не работает даже на Cygwin? приведенный выше код не будет работать на компьютерах с Windows.

person ebarr    schedule 30.03.2014
comment
Спасибо, это имеет смысл. Однако я не могу заставить signal.SIGALRM работать на Python 3.3.4. я получаю AttributeError: 'module' object has no attribute 'SIGALRM' - person user3294195; 30.03.2014
comment
Добавил строку в ответ, так как это важный момент и для других. - person ebarr; 30.03.2014
comment
Кроме того, этот пост в блоге обязателен к прочтению на эту тему: eli.thegreenplace.net/2011/08/22/ - person ebarr; 30.03.2014