Exception dans urllib.request.urlopen

Fermé
cs_perrierbertrand Messages postés 34 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 10 mars 2024 - 31 mars 2023 à 17:06
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 5 avril 2023 à 14:47

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 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
31 mars 2023 à 17:21

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 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
31 mars 2023 à 17:26

un exemple:

try:
    a=0/0
except Exception as e:
    print("oups",e)
0
cs_perrierbertrand Messages postés 34 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 10 mars 2024
31 mars 2023 à 17:25

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 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
31 mars 2023 à 19:14

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 34 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 10 mars 2024
Modifié le 31 mars 2023 à 18:30

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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 5 avril 2023 à 14:47

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