<urlopen error [Errno 4] Interrupted system call>
bu IOError
alt sınıfların urllib2
, aslında bir URLError
olduğunu gösterir, ama tamamen farklı bir bağımsız değişken yönetir. Bu nedenle errno
ve strerror
öznitelikleri başlatılamıyor. Hem neden olarak dizeleri geçirir:
raise URLError("qop '%s' is not supported." % qop)
ve diğer kaynaklardan gelen özel durumları sarar: her zamanki yerinde errno bulamazsınız nedeni budur
try:
h.request(req.get_method(), req.get_selector(), req.data, headers)
except socket.error, err: # XXX what error?
h.close()
raise URLError(err)
:
>>> try:
urlopen('http://asdf')
except URLError, e:
pass
...
>>> e
URLError(gaierror(-2, 'Name or service not known'),)
>>> e.errno
>>> e.reason
gaierror(-2, 'Name or service not known')
>>> e.reason.errno
-2
Bu, bu durumda çalıştı, ancak neden özniteliği bir dize veya socket.error
olabilir, has (had) its own problems with errno.
urllib2.py içinde URLError
tanımı:
class URLError(IOError):
# URLError is a sub-type of IOError, but it doesn't share any of
# the implementation. need to override __init__ and __str__.
# It sets self.args for compatibility with other EnvironmentError
# subclasses, but args doesn't have the typical format with errno in
# slot 0 and strerror in slot 1. This may be better than nothing.
def __init__(self, reason):
self.args = reason,
self.reason = reason
def __str__(self):
return '<urlopen error %s>' % self.reason
Yani uzun lafın kısası, bu korkunç bir karmaşa.
e.reason
için e.reason
numaralı telefonu kontrol etmelisiniz. Eğer öyleyse, hiçbir yerde errno olacaktır.
socket.error
mı? Bunun tuhaflıklarını hallet. Yine single string argument ile yükseltilebildiğinden errno özniteliği veya None
özniteliği kaldırılabilir.
IOError
veya OSError
'un bir alt sınıfı mıdır (EnvironmentError
alt sınıfı)? Bunun errno özniteliğini okuyun ve en iyisi için umuyoruz.
Bu, muhtemelen sizin durumunuz için aşırı derecede ihtiyatlı olabilir, ancak kenarları anlamak güzeldir. Tornado had similar issues ve utility function to get errno from exception kullanıyor, ancak maalesef bu işlev URLErrors ile çalışmaz.
en azından bazı durumlarda ne kapsayabilecek:
while True: # or some amount of retries
try:
response = urllib2.urlopen(req, timeout=30)
break
except URLError, e:
if getattr(e.reason, 'errno', None) == errno.EINTR:
# Retry
continue
Hangi piton 2 tam olarak? 'socket.error', bir noktada hataların sonuç değerlerini ve sonuçta oluşan argümanları bozmaya neden olan 'IOError' alt sınıfına değiştirildi. –
Python 2.7 –
kullanıyoruz Bu, https://bugs.python.org/issue6471 veya en azından ilgili olabilir. –