【问题标题】:urllib2 and Try/Except in a loopurllib2 和 Try/Except 在循环中
【发布时间】:2015-07-01 04:55:15
【问题描述】:

我正在尝试通过用 Python 编写国际空间站跟踪器来了解 Python 中的异常处理。

我已阅读 https://docs.python.org/2/tutorial/errors.html 并发现 Handle errors with urllib2 很有用,但我很难理解如何让代码在抛出异常的情况下继续循环,我不确定如何进一步研究。

我有这个工作代码。它在我的 Raspberry Pi 上运行了好几天,作为一个更大的程序的一部分,当 ISS 在头顶时,它会亮起绿灯。但最终,会导致错误并且程序停止。即使调用了错误,我也在寻找一种让程序继续运行的方法。 IE。此函数每 10 秒调用一次,但如果出现错误,我希望程序在 10 秒后简单地重试,同时注意错误。

def issPosition(n):
    try:
        req = urllib2.Request("http://api.open-notify.org/iss-now.json")
        response = urllib2.urlopen(req)
        obj = json.loads(response.read())
        if n == "lat":
            return obj['iss_position']['latitude']
        elif n == "long":
            return obj['iss_position']['longitude']

    except urllib2.HTTPError, e:
        GPIO.output(24,True)
        time.sleep(0.1)
        GPIO.output(24,False)
        print 'HTTPError = ' + str(e.code)

    except urllib2.URLError, e:
        GPIO.output(26,True)
        time.sleep(0.1)
        GPIO.output(26,False)
        print 'URLError = ' + str(e.reason)

    except httplib.HTTPException, e:
        GPIO.output(26,True)
        time.sleep(0.1)
        GPIO.output(26,False)
        print 'HTTPException'

    except Exception:
        GPIO.output(26,True)
        time.sleep(0.1)
        GPIO.output(26,False)
        import traceback
        print 'generic exception: ' + traceback.format_exc() 

指针将不胜感激。谢谢。

【问题讨论】:

  • 休眠十秒并记录错误
  • 什么是未捕获的错误?
  • 我会重构你的代码,这样你就不会重复自己(DRY)。重复了几行,这将有助于将其放入一个函数中,因此如果您想更改睡眠时间,请在一个地方而不是 3 处更改它。此外,您仍然可以在最后一个 except 块中将 e 作为异常传入,并且将 e 转换为 str。最后,通过处理错误,它将继续。您不需要做其他任何事情。它不赞成在没有特定错误的情况下执行 try/except 是有原因的。
  • 我在您的代码中没有看到任何循环。你是从循环中调用 issPosition 吗?如果是,请不要处理此方法中的异常或简单地重新抛出它。并让循环处理异常并继续执行。
  • 您使用的是 python 2 还是 3?也许你可以使用this。搜索抑制

标签: python urllib2


【解决方案1】:

我在您的代码中没有看到任何循环。你是从循环中调用 issPosition 吗? 如果是,请不要在此方法中处理异常,或者重新抛出它。并处理循环中的异常并继续执行。 例如:

while(True):
  try:
    result = issPosition(12334584)
    # Use your result here ....
  except:
    # Log and continue
    continue

** 这将永远运行。您可能需要添加额外的逻辑来最终结束循环。

【讨论】:

  • 为什么这被否决了?探索“继续”似乎是一个很好的步骤?
  • @Russell 可能是因为这样做是不好的做法 try:/except: 像那样。通常,您只想捕获可以处理的错误。如果您正在迭代 NoneType 并导致稍后在程序中破坏其他东西的问题会发生什么?通常这会引发 NoneType 错误,但这样它什么也不做。另外你怎么戒掉这个?你不能做一个键盘中断,除了会捕捉到它。您可以添加额外的逻辑来结束循环,但这会很痛苦。
  • 我的回答是给操作一个解决问题的想法。任何解决方案都将涉及类似的东西,您可以选择有选择地处理异常。最重要的是,如果要求永远运行,我们必须这样做。其他的都只是说说而已。
  • @gipsy 或者您可以将其设置为作为守护进程运行(这是执行此类操作的正确方法)甚至是 cron 脚本(最早每 1 分钟运行一次。)
  • 真的很好奇。异常情况下的守护进程会发生什么?您是否也不需要在您的守护进程中使用类似的 continue 语义? .但你让我思考,我认为他的树莓派应用程序的最佳解决方案是每分钟左右从 cron 运行它。
猜你喜欢
  • 1970-01-01
  • 2016-04-06
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多