Fehler von urllib2 abfangen? [solved]

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
root_tux_linux
User
Beiträge: 36
Registriert: Sonntag 16. Dezember 2007, 04:18

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?
Zuletzt geändert von root_tux_linux am Dienstag 18. März 2008, 18:39, insgesamt 1-mal geändert.
AMD Athlon 64 X2 6000+, ASUS M2N-SLI Deluxe, ASUS EN8600GTS Silent, 4GB Apacer DDR2 800Mhz | Gentoo Linux x86_64
AMD Sempron 2500+, MSI KT4, ASUS N6200, 2x 512MB Apacher DDR 400Mhz, Hauppauge PVR150 | Arch Linux i686
### Sorry for my bad english ###
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wie sieht der Fehler aus? Ist es überhaupt eine Exception, oder vielleicht doch eine Warning?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Evtl. wird auf stderr ein Hinweis ausgegeben?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
root_tux_linux
User
Beiträge: 36
Registriert: Sonntag 16. Dezember 2007, 04:18

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 :)
AMD Athlon 64 X2 6000+, ASUS M2N-SLI Deluxe, ASUS EN8600GTS Silent, 4GB Apacer DDR2 800Mhz | Gentoo Linux x86_64
AMD Sempron 2500+, MSI KT4, ASUS N6200, 2x 512MB Apacher DDR 400Mhz, Hauppauge PVR150 | Arch Linux i686
### Sorry for my bad english ###
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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
root_tux_linux
User
Beiträge: 36
Registriert: Sonntag 16. Dezember 2007, 04:18

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
AMD Athlon 64 X2 6000+, ASUS M2N-SLI Deluxe, ASUS EN8600GTS Silent, 4GB Apacer DDR2 800Mhz | Gentoo Linux x86_64
AMD Sempron 2500+, MSI KT4, ASUS N6200, 2x 512MB Apacher DDR 400Mhz, Hauppauge PVR150 | Arch Linux i686
### Sorry for my bad english ###
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

sieh auch [wiki]Die global-Anweisung[/wiki] :lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
root_tux_linux
User
Beiträge: 36
Registriert: Sonntag 16. Dezember 2007, 04:18

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
AMD Athlon 64 X2 6000+, ASUS M2N-SLI Deluxe, ASUS EN8600GTS Silent, 4GB Apacer DDR2 800Mhz | Gentoo Linux x86_64
AMD Sempron 2500+, MSI KT4, ASUS N6200, 2x 512MB Apacher DDR 400Mhz, Hauppauge PVR150 | Arch Linux i686
### Sorry for my bad english ###
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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..
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
root_tux_linux
User
Beiträge: 36
Registriert: Sonntag 16. Dezember 2007, 04:18

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 ^^
AMD Athlon 64 X2 6000+, ASUS M2N-SLI Deluxe, ASUS EN8600GTS Silent, 4GB Apacer DDR2 800Mhz | Gentoo Linux x86_64
AMD Sempron 2500+, MSI KT4, ASUS N6200, 2x 512MB Apacher DDR 400Mhz, Hauppauge PVR150 | Arch Linux i686
### Sorry for my bad english ###
Antworten