Seite 1 von 1

Fehler von urllib2 abfangen? [solved]

Verfasst: Sonntag 16. März 2008, 17:15
von root_tux_linux
Juten Tag :)

Hab da ein kleines Problem.

Mein Script ruft mittels urllib2.urlopen() eine Adresse auf, ab und an kommt es vor das es ich ein urllib2.HTTPError, urllib2.URLError Fehlermeldung erhalte die weiter nicht tragisch ist nur optisch nicht schön.

Also hab ich folgendes gemacht:

Code: Alles auswählen

try:
 CODE
except (urllib2.HTTPError, urllib2.URLError):
 pass
Das Problem ist jedoch das die Fehlermeldung dennoch kommt.
Selbst wenn ich folgendes mache:

Code: Alles auswählen

try:
 CODE
except:
 pass
Alles andere wird abgefangen nur die urllib2 Meldungen nicht. :(

Jemand ne Idee?

Verfasst: Sonntag 16. März 2008, 17:24
von Leonidas
Wie sieht der Fehler aus? Ist es überhaupt eine Exception, oder vielleicht doch eine Warning?

Verfasst: Sonntag 16. März 2008, 17:32
von jens
Evtl. wird auf stderr ein Hinweis ausgegeben?

Verfasst: Sonntag 16. März 2008, 21:59
von root_tux_linux

Code: Alles auswählen

  
  File "/usr/lib/python2.5/urllib2.py", line 380, in open
    response = meth(req, response)
  File "/usr/lib/python2.5/urllib2.py", line 491, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.5/urllib2.py", line 418, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.5/urllib2.py", line 353, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.5/urllib2.py", line 499, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 503: Forwarding failure
Das wär die Fehlermeldung :)

Verfasst: Montag 17. März 2008, 08:32
von helduel
Moin,

bist du sicher, dass das komplette URL-Handling innerhalb des try-except-Blocks geschieht? Oder öffnest du vielleicht nur die URL darin und liest später außerhalb des try-except-Blocks? HTTP 503 bedeutet, dass der Service vorübergehend nicht zu erreichen ist (wegen Überlastung, z.B.). D.h. öffnen konntest du die URL schon, aber lesen geht momentan nicht.

Gruß,
Manuel

Verfasst: Montag 17. März 2008, 23:29
von root_tux_linux
helduel hat geschrieben:Moin,

bist du sicher, dass das komplette URL-Handling innerhalb des try-except-Blocks geschieht? Oder öffnest du vielleicht nur die URL darin und liest später außerhalb des try-except-Blocks? HTTP 503 bedeutet, dass der Service vorübergehend nicht zu erreichen ist (wegen Überlastung, z.B.). D.h. öffnen konntest du die URL schon, aber lesen geht momentan nicht.

Gruß,
Manuel
Eigentlich schon.

Die eine Funktion die ProxyHandler, build_opener und addheader übergibt steht ausserhalb des Try. Spielt aber doch keine Rolle wenn ich die Funktion erst im Try mittels proxy() aufrufe oder seh ich das falsch?

Code: Alles auswählen

def proxy():
    global proxy_handler, opener
    proxy = raw_input('Switch proxyserver off? (default on): ')
    proxy_handler = urllib2.ProxyHandler({'http': 'localhost:8118'})

    if not proxy:
        opener = urllib2.build_opener(proxy_handler)
    else:
        opener = urllib2.build_opener() 
    opener.addheaders = [('User-agent', 'python rockz!')]
Also:

Code: Alles auswählen

def proxy():
    global proxy_handler, opener
    proxy = raw_input('Switch proxyserver off? (default on): ')
    proxy_handler = urllib2.ProxyHandler({'http': 'localhost:8118'})

    if not proxy:
        opener = urllib2.build_opener(proxy_handler)
    else:
        opener = urllib2.build_opener() 
    opener.addheaders = [('User-agent', 'python rockz!')]

try:
 proxy()
 CODE
except (urllib2.HTTPError, urllib2.URLError):
 pass

Verfasst: Dienstag 18. März 2008, 00:52
von EyDu
Lauf doch mal mit einem Debugger durch, vielleicht übersiehst du irgendwo einfach nur eine Kleinigkeit.

Und noch ein kurzer Tipp zu deinem Code: "global" ist wirklich böse und führt oftmals zu aüßerst kniffligen Fehlern! Gibt den Proxy-Handler und den Opener einfach als Rückgabewert aus der "proxy"-Funktion zurück:

Code: Alles auswählen

def proxy():
    proxy = raw_input('Switch proxyserver off? (default on): ')
    proxy_handler = urllib2.ProxyHandler({'http': 'localhost:8118'})

    if not proxy:
        opener = urllib2.build_opener(proxy_handler)
    else:
        opener = urllib2.build_opener() 
    opener.addheaders = [('User-agent', 'python rockz!')]
    
    return proxy_handler, opener

try:
 proxy_handler, opener = proxy()
 CODE
except (urllib2.HTTPError, urllib2.URLError):
 pass

Verfasst: Dienstag 18. März 2008, 07:46
von jens
sieh auch [wiki]Die global-Anweisung[/wiki] :lol:

Verfasst: Dienstag 18. März 2008, 18:39
von root_tux_linux
Hab den Fehler durch nen Kumpel gelöst.

Anscheinend wurde er durch Thread und Urllib2 verursacht :)

Werd das global mit return opener und proxy_handler ersetzen

Trotzdem danke

Verfasst: Dienstag 18. März 2008, 18:44
von Trundle
root_tux_linux hat geschrieben:Anscheinend wurde er durch Thread und Urllib2 verursacht :)
Wenn du dort, wo ``CODE`` steht, einen neuen Thread startest und in dem wird die Exception ge`raise`t, dann wird die natürlich nicht von dem try-except-Block abgefangen..

Verfasst: Dienstag 18. März 2008, 19:07
von Leonidas
Trundle hat geschrieben:Wenn du dort, wo ``CODE`` steht, einen neuen Thread startest und in dem wird die Exception ge`raise`t, dann wird die natürlich nicht von dem try-except-Block abgefangen..
Die Moral von der Geschicht': Pseudocode postet man nicht. 8)

Verfasst: Dienstag 18. März 2008, 21:47
von root_tux_linux
Leonidas hat geschrieben:
Trundle hat geschrieben:Wenn du dort, wo ``CODE`` steht, einen neuen Thread startest und in dem wird die Exception ge`raise`t, dann wird die natürlich nicht von dem try-except-Block abgefangen..
Die Moral von der Geschicht': Pseudocode postet man nicht. 8)
Ja, aber das ist mir peinlich meinen Noobiecode zu zeigen ^^