【问题标题】:Ignoring exceptions for a specific amount of time在特定时间内忽略异常
【发布时间】:2015-05-13 17:12:39
【问题描述】:

试图让try 在循环中运行,因为我正在引导一台包含网络服务器的机器,我想让它运行,而不仅仅是直接转到except 并停止脚本。我已经为 http-status 代码做了一段时间,但这只有在机器启动时才有效。

所以我的问题是我怎样才能让try 循环大约 5 分钟,然后再转到except?对不起,我的解释很糟糕。

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"

【问题讨论】:

  • 如果你睡了 30 秒,你想继续尝试 5 分钟,你就必须循环 10 次,对吧?
  • 如果连接被拒绝,你会得到一个异常。你的意思是你想在完全放弃之前继续循环 5 分钟?
  • 正确,因为如果网络服务器关闭,它会直接进入异常。所以我想让它循环 5 分钟,直到它出现异常。 @MartijnPieters
  • 检查http代码的循环不是问题,而是异常,因为它直接进入异常并在网络服务器未启动时停止。我想让它在停止之前循环 5 分钟。 @alfasin
  • @MartijnPieters 当然,谢谢。

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


【解决方案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 分钟过去开始。如果您想在这种情况下做一些特殊的事情,您还可以保留异常。

【讨论】:

  • 谢谢你的作品。如果它得到 http-code 200,我怎样才能让它脱离循环?
  • 只需在else 块内添加break
  • @Iknowpython 更新了答案,向您展示了 break 语句
  • 非常感谢您的帮助,让我明白该怎么做。
  • @Iknowpython 它可能会出现一个不同的异常,该块只捕获requests.ConnectionError 类型的异常——这就是你得到的吗?
猜你喜欢
  • 1970-01-01
  • 2020-03-05
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2017-11-14
  • 2011-03-17
相关资源
最近更新 更多