Ich versuche, 3 URLs gleichzeitig aufzurufen und Fehler zu protokollieren. Hier ist mein Beispielcode:Python: Wie kann man herausfinden, welche URL mit urllib2 und pool.map nicht funktioniert?
urls = ["https://example.com/gives200.php", "https://example.com/alsogives200.php", "https://example.com/gives500.php"];
try:
results = pool.map(urllib2.urlopen, urls);
except URLError:
urllib2.urlopen("https://example.com/log_error/?url="+URLError.url);
Ich möchte nur wissen, welche URLs (falls vorhanden) Fehler begangen, indem sie diese /log_error/
URL aufrufen zu müssen. Aber wenn ich den Code so habe, bekomme ich eine Fehlermeldung, dass URLError
nicht definiert ist.
ich tun, um diese Einfuhren an der Spitze von meinem Code haben:
import urllib2
from multiprocessing.dummy import Pool as ThreadPool
Hier ist meine ganze Fehlerantwort (das AWS Lambda verwendet, für was auch immer es sich lohnt)
{
"stackTrace": [
[
"/var/task/lambda_function.py",
27,
"lambda_handler",
"except Error as e:"
]
],
"errorType": "NameError",
"errorMessage": "global name 'URLError' is not defined"
}
Wie Ich erfasse die fehlerhaften URLs, damit ich weiß, welche sie sind?
UPDATE
ich es herausgefunden: die urllib.error
Klasse, die URLError
ein Teil ist, ist genau das: urllib
, nichturllib2
.
Die Oberseite dieser Dokumentation Seite erklärt, dass: https://docs.python.org/2/library/urllib2.html
Und hier ist das ausführlichere Objekt httperror, dass ich tatsächlich bekommen: https://docs.python.org/2/library/urllib2.html#urllib2.HTTPError
Das Problem der URL erroring selbst wenn noch existiert ... zur Zeit Ich habe keine Möglichkeit zu identifizieren, welche URL die eine ist.
UPDATE 2
Offenbar str(e.url)
alles war ich brauchte. Ich habe dazu keine Dokumentation gefunden; es war nur eine glückliche Vermutung meinerseits.
Das ist also der Arbeits Code jetzt:
urls = ["https://example.com/gives200.php", "https://example.com/alsogives200.php", "https://example.com/gives500.php"];
try:
results = pool.map(urllib2.urlopen, urls);
except Exception as e:
urllib2.urlopen("https://example.com/log_error/?url="+str(e.url)+"&code="+str(e.code)+"&reason="+e.reason;
UPDATE 3
Dank informing me about the dangers of pool.map
@mfripp ich diesen Code überarbeitet haben einmal mehr dazu:
def my_urlopen(url):
try:
return urllib2.urlopen(url)
except URLError:
urllib2.urlopen("https://example.com/log_error/?url="+url)
return None
def lambda_handler(event, context):
urls = [
"https://example.com/gives200.php",
"https://example.com/alsogives200.php",
"https://example.com/gives500.php"
];
results = pool.map(urllib2.urlopen, urls);
return urls;
Wie funktioniert das mit der pool.map? – Bing