【发布时间】: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。搜索抑制