2010-04-26 12 views
53

Ich verwende den Timeout-Parameter innerhalb der urlopen der urllib2.Zeitlimit von urllib2 verarbeiten? - Python

Wie kann ich Python mitteilen, dass ein benutzerdefinierter Fehler ausgelöst werden sollte, wenn das Zeitlimit abgelaufen ist?


Irgendwelche Ideen?

+1

Hinweis: [Der Parameter 'timeout' begrenzt weder die * Gesamt * Verbindungszeit noch die * Gesamt * Lese- (Antwortzeit).] (Http://stackoverflow.com/a/32684677/4279) – jfs

Antwort

87

Es gibt sehr wenige Fälle, in denen Sie except: verwenden möchten. Dadurch jede Ausnahme erfasst, die schwer zu debuggen sein kann, und es fängt Ausnahmen SystemExit und KeyboardInterupt einschließlich, die Ihr Programm ärgerlich machen kann ..

Am einfachsten zu verwenden, würden Sie urllib2.URLError fangen:

try: 
    urllib2.urlopen("http://example.com", timeout = 1) 
except urllib2.URLError, e: 
    raise MyException("There was an error: %r" % e) 

folgendes sollte den spezifischen Fehler erfassen angehoben, wenn die Verbindung unterbrochen wird:

import urllib2 
import socket 

class MyException(Exception): 
    pass 

try: 
    urllib2.urlopen("http://example.com", timeout = 1) 
except urllib2.URLError, e: 
    # For Python 2.6 
    if isinstance(e.reason, socket.timeout): 
     raise MyException("There was an error: %r" % e) 
    else: 
     # reraise the original error 
     raise 
except socket.timeout, e: 
    # For Python 2.7 
    raise MyException("There was an error: %r" % e) 
+5

Dies funktioniert nicht in Python 2.7, da URLError socket.timeout nicht mehr abfängt –

+0

@TalWeiss danke, einen zusätzlichen Catch für 'socket.timeout' hinzugefügt – dbr

+1

Wie bei Python 2.7.5 Timeouts werden von urllib2.URLError abgefangen. –