Python urllib2和Try/Except在循环中

Python urllib2和Try/Except在循环中,python,urllib2,Python,Urllib2,我试图通过用python编写一个国际空间站跟踪器来学习python中的异常处理 我已经阅读并发现它很有用,但我很难理解如何在抛出异常的情况下让代码继续循环,我不知道如何进一步研究这个问题 我有这个工作代码。它在我的Raspberry Pi上运行数天,作为一个更大程序的一部分,当ISS在头顶时,它会亮起绿灯。不过,最终会导致错误,程序停止。我正在寻找一种方法,即使调用了错误,程序也可以继续。也就是说,该函数每10秒调用一次,但如果出现错误,我希望程序在10秒后再次尝试,同时记录错误 def iss

我试图通过用python编写一个国际空间站跟踪器来学习python中的异常处理

我已经阅读并发现它很有用,但我很难理解如何在抛出异常的情况下让代码继续循环,我不知道如何进一步研究这个问题

我有这个工作代码。它在我的Raspberry Pi上运行数天,作为一个更大程序的一部分,当ISS在头顶时,它会亮起绿灯。不过,最终会导致错误,程序停止。我正在寻找一种方法,即使调用了错误,程序也可以继续。也就是说,该函数每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() 

如有指点,将不胜感激。谢谢。

我在代码中没有看到任何循环。你是从循环中调用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运行一次。