在特定时间内忽略异常

时间:2015-03-11 18:32:58

标签: python python-2.7 loops while-loop python-requests

尝试让try在循环中运行,因为我正在启动包含Web服务器的计算机,我想让它运行而不是直接转到except并停止脚本。我已经为http状态代码做了一段时间,但这只有在机器启动时才有效。

所以我的问题是如何在try之前将except循环播放5分钟?对不起,我的解释很糟糕。

try:
    r = requests.head("http://www.testing.co.uk")

    while r.status_code != 200:
        print "Response not == to 200."
        time.sleep(30)
        r = requests.head("http://www.testing.co.uk")

    else:
        print "Response is 200 - OK"

except requests.ConnectionError:
    print "NOT FOUND - ERROR"

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

import requests, time, datetime

# Determine "end" time -- in this case, 5 minutes from now
t_end = datetime.datetime.now() + datetime.timedelta(minutes=5)

while True:
    try:
        r = requests.head("http://www.testing.co.uk")

        if r.status_code != 200:
            # Do something
            print "Response not == to 200."
        else:
            # Do something else
            print "Response is 200 - OK"
            break  # Per comments

        time.sleep(30)  # Wait 30 seconds between requests

    except requests.ConnectionError as e:
        print "NOT FOUND - ERROR"
        # If the time is past the end time, re-raise the exception
        if datetime.datetime.now() > t_end: raise e
        time.sleep(30)  # Wait 30 seconds between requests

重要的一点是:

if datetime.datetime.now() > t_end: raise e

如果不满足条件(少于5分钟),则会默默忽略该异常并继续while循环。

如果符合条件 ,则异常为re-raised由其他一些外部代码处理或根本不处理 - 在这种情况下,您将看到异常“打破“(用你的话说)程序。

使用此方法优于(而不是while True:)的好处:

while datetime.datetime.now() > t_end:

如果你发现自己在while循环之外,你知道你是从break而不是从5分钟到达那里的。如果你想在这种情况下做一些特别的事情,你也可以保留例外。