web-dev-qa-db-fra.com

attraper une erreur HTTP spécifique dans python

Je veux attraper une erreur http spécifique et pas une personne de toute la famille .. ce que j'essayais de faire est -

import urllib2
try:
   urllib2.urlopen("some url")
except urllib2.HTTPError:
   <whatever>

mais ce que je finis par attraper n'importe quel type d'erreur http, mais je veux attraper seulement si la page Web spécifiée n'existe pas !! il s'agit probablement de l'erreur HTTP 404..mais je ne sais pas comment spécifier cette erreur 404 uniquement et laisser le système exécuter le gestionnaire par défaut pour d'autres événements ... des suggestions ??

60
Arnab Sen Gupta

Attrapez juste urllib2.HTTPError, gérez-le et s'il ne s'agit pas de l'erreur 404, utilisez simplement raise pour relancer l'exception.

Voir le tutoriel Python .

Vous pourriez donc faire:

import urllib2
try:
   urllib2.urlopen("some url")
except urllib2.HTTPError as err:
   if err.code == 404:
       <whatever>
   else:
       raise
106
Tim Pietzcker

Pour Python 3.x

import urllib.request
try:
    urllib.request.urlretrieve(url, fullpath)
except urllib.error.HTTPError as err:
    print(err.code)
36
Lazik

La réponse de Tims me semble trompeuse. Surtout quand urllib2 ne renvoie pas le code attendu. Par exemple, cette erreur sera fatale (croyez-le ou non - elle n'est pas rare lors du téléchargement d'URL):

AttributeError: l'objet 'URLError' n'a pas d'attribut 'code'

Rapide, mais la meilleure solution n'est peut-être pas le code utilisant le bloc try/except imbriqué:

import urllib2
try:
    urllib2.urlopen("some url")
except urllib2.HTTPError, err:
    try:
        if err.code == 404:
            # Handle the error
        else:
            raise
    except:
        ...

Plus d'informations sur le sujet des blocs try/except imbriqués Les blocs try/except imbriqués sont-ils dans python une bonne pratique de programmation?

3
sonavolob