处理来自urllib2的异常和在Python机械化(Handling exceptions from

2019-08-17 23:50发布

我在使用异常处理是新手。 我现在用的是机械化模块凑几个网站。 我的程序常常失败,因为连接较慢,因为请求暂停。 我希望能够重试网站(上超时,例如)最多5次后之间的每个尝试30秒延迟。

我看着这个计算器的答案,可以看我怎么可以处理各种异常。 我也看到了(虽然它看起来很笨拙)我怎么可以把试/异常while循环来控制5次尝试内......但我不知道如何打出来的循环,或“继续”,当连接是成功的,没有异常已经抛出。

from mechanize import Browser
import time

b = Browser()
tried=0
while tried < 5:
  try:
    r=b.open('http://www.google.com/foobar')
  except (mechanize.HTTPError,mechanize.URLError) as e:
    if isinstance(e,mechanize.HTTPError):
      print e.code
      tried += 1
      sleep(30)
      if tried > 4:
        exit()
    else:
      print e.reason.args
      tried += 1
      sleep(30)
      if tried > 4:
        exit()

print "How can I get to here after the first successful b.open() attempt????"

我将不胜感激约(1)如何打破循环的一个成功的开放的意见,和(2)如何使整个街区少笨拙/更优雅。

Answer 1:

您不必再重复的东西在不同的是,你在任何情况下做块。

from mechanize import Browser
import time

b = Browser()
tried=0
while True:
  try:
    r=b.open('http://www.google.com/foobar')
  except (mechanize.HTTPError,mechanize.URLError) as e:
      tried += 1
    if isinstance(e,mechanize.HTTPError):
      print e.code
    else:
      print e.reason.args
    if tried > 4:
      exit()
    sleep(30)
    continue
  break

此外,您可能能够使用while not r:这取决于Browser.open返回。

编辑: roadierich呈现出更优雅的方式与

try:
  doSomething()
  break
except:
  ...

因为错误跳到除了块。



Answer 2:

你的第一个问题是可以做到的break

while tried < 5:
  try:
    r=b.open('http://www.google.com/foobar')
    break
  except #etc...

真正的问题,但是,你真的想:这就是被称为“意大利面条代码”:如果你试图通过程序图的执行,它看起来像意大利面条板。

你有真正的(恕我直言)的问题,是你的退出while循环的逻辑是有缺陷的。 而不是尝试,直到你已经有了一个连接,停止了一些尝试(即不会发生,因为你已经离开反正一个条件)后,循环:

#imports etc

tried=0
connected = False
while not Connected:
    try:
        r = b.open('http://www.google.com/foobar')
        connected = true # if line above fails, this is never executed
    except mechanize.HTTPError as e:
        print e.code            
        tried += 1        
        if tried > 4:
            exit() 
        sleep(30)

    except mechanize.URLError as e:
        print e.reason.args            
        tried += 1
        if tried > 4:
            exit()        
        sleep(30)

 #Do stuff


Answer 3:

关于第一个问题,你只是想在“破发”的关键字,它打破了一个循环。

对于第二个问题,你可以有几个“除了”条款的一个“尝试”,针对不同类型的异常。 这将替换您的isinstance()检查,将让你的代码更加清晰。



文章来源: Handling exceptions from urllib2 and mechanize in Python