Python urllib2和Try/Except在循环中
我试图通过用python编写一个国际空间站跟踪器来学习python中的异常处理 我已经阅读并发现它很有用,但我很难理解如何在抛出异常的情况下让代码继续循环,我不知道如何进一步研究这个问题 我有这个工作代码。它在我的Raspberry Pi上运行数天,作为一个更大程序的一部分,当ISS在头顶时,它会亮起绿灯。不过,最终会导致错误,程序停止。我正在寻找一种方法,即使调用了错误,程序也可以继续。也就是说,该函数每10秒调用一次,但如果出现错误,我希望程序在10秒后再次尝试,同时记录错误Python urllib2和Try/Except在循环中,python,urllib2,Python,Urllib2,我试图通过用python编写一个国际空间站跟踪器来学习python中的异常处理 我已经阅读并发现它很有用,但我很难理解如何在抛出异常的情况下让代码继续循环,我不知道如何进一步研究这个问题 我有这个工作代码。它在我的Raspberry Pi上运行数天,作为一个更大程序的一部分,当ISS在头顶时,它会亮起绿灯。不过,最终会导致错误,程序停止。我正在寻找一种方法,即使调用了错误,程序也可以继续。也就是说,该函数每10秒调用一次,但如果出现错误,我希望程序在10秒后再次尝试,同时记录错误 def iss
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()
如有指点,将不胜感激。谢谢。我在代码中没有看到任何循环。你是从循环中调用issPosition吗? 如果是,请不要在此方法中处理异常,或者重新抛出它。并处理循环中的异常并继续执行。 例如:
while(True):
try:
result = issPosition(12334584)
# Use your result here ....
except:
# Log and continue
continue
**这将永远持续下去。您可能需要添加额外的逻辑以最终结束循环。睡眠十秒钟并记录错误什么是未捕获的错误?我会折射您的代码,这样您就不会重复自己的操作(干)。重复几行,这将有助于将其放入函数中,因此如果您想更改睡眠时间,可以在一个位置而不是3个位置进行更改。此外,您仍然可以在最后一个Exception块中将e作为异常传递,并将e强制转换为str。最后,通过处理错误,它将继续。你不需要做其他事情。有一个原因不赞成在没有特定错误的情况下执行try/except。我在代码中没有看到任何循环。你是从循环中调用issPosition吗?如果是,请不要处理此方法中的异常,或者简单地重新抛出它。让循环处理异常并继续执行。您使用的是python 2还是python 3?也许你可以用。搜索Suppress为什么这被否决了?探索“继续”似乎是一个很好的步骤?@Russell可能是因为尝试是一种不好的做法:/except:像那样。通常,您只希望捕获可以处理的错误。如果您在一个非类型上进行迭代,并导致程序在稍后的时候出现问题,从而破坏其他内容,会发生什么情况?通常情况下,这会引发非类型错误,但这样做不会产生任何效果。你怎么戒掉这个?你不能进行键盘中断,除非能捕捉到。你可以添加额外的逻辑来结束循环,但那会很痛苦。我的答案是给op一个解决问题的想法。任何解决方案都会涉及类似的内容,您可以选择有选择地处理异常。最重要的是,如果要求永远运行,我们必须这样做。其他一切都只是说说而已。@gipsy或者你可以设置它作为一个执事运行(这是做这类事情的正确方式)或者甚至是一个cron脚本(最早每1分钟运行一次)只是出于真正的好奇。在例外情况下,执事会发生什么?你不需要在你的执事中也使用类似的continue语义吗。但你让我思考,我认为他的raspberry py应用程序的最佳解决方案是每隔一分钟左右从cron运行一次。