如何重试urllib2.urlopen n次
我正在尝试实现一个装饰器,用来重复尝试打开一个网址 n 次。可是我这个装饰器一直没法正常工作。当我运行它的时候,出现了以下错误信息:
追踪信息(最近的调用在最前面):
文件 "F:\retry\dec_class.py",第 60 行,在
x.getURLdata('127.0.0.1')
类型错误:'NoneType' 对象不可调用
有没有人能帮我一下呢?
import serial, urllib2, time
from functools import wraps
import xml.etree.cElementTree as ET
from xml.etree.cElementTree import parse
class Retry(object):
default_exceptions = (Exception)
def __init__(self, tries, exceptions=None, delay=0):
self.tries = tries
if exceptions is None:
exceptions = Retry.default_exceptions
self.exceptions = exceptions
self.delay = delay
def __call__(self, f):
def fn(*args, **kwargs):
tried = 0
exception = None
while tried <= self.tries:
try:
return f(*args, **kwargs)
except self.exceptions, e:
print "Retry, exception: "+str(e)
time.sleep(self.delay)
tried += 1
exception = e
#if no success after tries, raise last exception
raise exception
return fn
class getURL(object):
@Retry(2 )
def getURLdata(self, IPaddress):
try:
f = urllib2.urlopen(''.join(['http://', IPaddress]))
f = ET.parse(f)
return f
except IOError, err:
print("L112 IOError is %s" %err)
except urllib2.URLError, err:
print("L114 urllib2.URLError is %s" %err)
except urllib2.HTTPError, err:
print("L116 urllib2.HTTPError is %s" %err)
except Exception, err :
print("L118 Exception is %s" %err)
x = getURL()
x.getURLdata('127.0.0.1')
1 个回答
1
你的 __call__
方法没有返回 fn
。相反,它默认返回的是 None
,所以 getURLdata
就被绑定到了 None
上。