Exception dans urllib.request.urlopen

cs_perrierbertrand Messages postés 36 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

j'aimerai savoir comment connaitre les différentes exceptions qui existe dans une fonction en général.

Et plus particulièrement pour urllib.request.urlopen(

car j'ai une erreur quand urlopen n'arrive pas à ouvrir l'url

et je n'arrive pas à avoir l'exception

voici l'erreur

Traceback (most recent call last):
  File "/usr/lib/python3.10/urllib/request.py", line 1348, in do_open
    h.request(req.get_method(), req.selector, req.data, headers,
  File "/usr/lib/python3.10/http/client.py", line 1282, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/lib/python3.10/http/client.py", line 1328, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.10/http/client.py", line 1277, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.10/http/client.py", line 1037, in _send_output
    self.send(msg)
  File "/usr/lib/python3.10/http/client.py", line 975, in send
    self.connect()
  File "/usr/lib/python3.10/http/client.py", line 941, in connect
    self.sock = self._create_connection(
  File "/usr/lib/python3.10/socket.py", line 824, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
  File "/usr/lib/python3.10/socket.py", line 955, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -3] Temporary failure in name resolution

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/bertrand/linux/script/updatedns3.py", line 21, in <module>
    ip = url.urlopen("http://monip.outils-rezo.info/text").read().decode()
  File "/usr/lib/python3.10/urllib/request.py", line 216, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.10/urllib/request.py", line 519, in open
    response = self._open(req, data)
  File "/usr/lib/python3.10/urllib/request.py", line 536, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "/usr/lib/python3.10/urllib/request.py", line 496, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.10/urllib/request.py", line 1377, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "/usr/lib/python3.10/urllib/request.py", line 1351, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [Errno -3] Temporary failure in name resolution>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/bertrand/linux/script/updatedns3.py", line 27, in <module>
    except url.request.socket.timeout as e:
AttributeError: module 'urllib.request' has no attribute 'request'. Did you mean: 'Request'?

merci
Linux / Firefox 110.0

4 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

bonjour,

Sans ton code, cela n'est pas très clair.  Tu veux dire que tu ne parviens pas à intercepter l'erreur avec un try/except?

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

un exemple:

try:
    a=0/0
except Exception as e:
    print("oups",e)
0
cs_perrierbertrand Messages postés 36 Date d'inscription   Statut Membre Dernière intervention   1
 

oui j'ai déjà pas mal de except après mon try, mais ce sont des except trouvé à droite à gauche, mais j'aimerai trouvé tous ce qu'il existe (peut etre que c'est dans la librairie, ou dans un site référentiel)

voici mon try et mes except

try:
	ip = url.urlopen("http://monip.outils-rezo.info/text").read().decode()

except HTTPError as error:
    logging.error('HTTP Error: Data of %s not retrieved because %s\nURL: %s', name, error, url)
    sys.exit()
except URLError as error:
    if isinstance(error.reason, timeout):
        print ("Timeout Error: Data not retrieved because %s\nURL: %s" % (error, url))
        exit()
    else:
        print ("URL Error: Data not retrieved because %s\nURL: %s" % (error, url))
        exit()

except url.socket.error as e:
	print ("URLError : Une autre erreur avec le serveur : "+str(e))
	exit()
except url.HTTPError as e:
	print ("HTTPError : Le serveur n a pas pu repondre a la demande.")
	print ('Code erreur : ', e.code)
	exit()
except url.URLError as e:
	print ("URLError : Nous n\'avons pas reussi a atteindre le serveur .")
	print ("Code erreur : ", e.reason)
	exit()

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

Tu peux intercepter toutes les erreurs, même celles que tu ne connais pas.  Je pense qu'on n'est jamais certain qu'un développeur ne va pas ajouter une nouvelle erreur sans la documenter.

0
cs_perrierbertrand Messages postés 36 Date d'inscription   Statut Membre Dernière intervention   1
 

est-ce que toutes les exceptions sont ici ?

https://github.com/python/cpython/blob/3.11/Lib/urllib/error.py

il y aurait que 3 exceptions :URLError, HTTPError et ContentTooShortError


0
mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 

Bonjour,

Personnellement j'utiliserais requests.

import requests

ret = requests.get("http://monip.outils-rezo.info/text")
if ret.status_code == 200:
    content =  ret.content.decode()
    print(content)

Bonne chance

0