Exception dans urllib.request.urlopen

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

  1. Contributeur

    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
    1. Contributeur

      un exemple:

      try:
          a=0/0
      except Exception as e:
          print("oups",e)
      0
  2. 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
    1. Contributeur

      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
  3. 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
    1. Modérateur

      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