0

I have a simple function that sends an XML string to a URL and takes a response. I am not sure how to handle the case where the URL is invalid. I've tried to put "URLError" and "socket.gaierror" (both of which show up in the error output), but neither seems to catch the invalid URL Error.

import urllib.request as request

def getResponse(<params>):
    xmlReq = "an XML string"

    #make a new request
    new_req = request.Request(url="<an invalid URL>", 
              data=xmlReq)        

    try:
        xml_response = request.urlopen(new_req)
    except <not sure what error goes here to catch invalid URL>:
        print("Invalid URL. Aborting process.")
        quit()

This is the raw error output without the try-except block:

Traceback (most recent call last):
  File "C:\<python storage location>\Python\Python36-32\lib\urllib\request.py", line 1318, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "C:\<python storage location>\Python\Python36-32\lib\http\client.py", line 1239, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\<python storage location>\Python\Python36-32\lib\http\client.py", line 1285, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:\<python storage location>\Python\Python36-32\lib\http\client.py", line 1234, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:\<python storage location>\Python\Python36-32\lib\http\client.py", line 1026, in _send_output
    self.send(msg)
  File "C:\<python storage location>\Python\Python36-32\lib\http\client.py", line 964, in send
    self.connect()
  File "C:\<python storage location>\Python\Python36-32\lib\http\client.py", line 1392, in connect
    super().connect()
  File "C:\<python storage location>\Python\Python36-32\lib\http\client.py", line 936, in connect
    (self.host,self.port), self.timeout, self.source_address)
  File "C:\<python storage location>\Python\Python36-32\lib\socket.py", line 704, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
  File "C:\<python storage location>\Python\Python36-32\lib\socket.py", line 745, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11001] getaddrinfo failed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\<my workspace>\XMLReq.py", line ##, in <module>
    getResponse(<params>)
  File "C:\<my workspace>\XMLReq.py", line ##, in getResponse
    xml_response = request.urlopen(new_req)
  File "C:\<python storage location>\Python\Python36-32\lib\urllib\request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\<python storage location>\Python\Python36-32\lib\urllib\request.py", line 526, in open
    response = self._open(req, data)
  File "C:\<python storage location>\Python\Python36-32\lib\urllib\request.py", line 544, in _open
    '_open', req)
  File "C:\<python storage location>\Python\Python36-32\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\<python storage location>\Python\Python36-32\lib\urllib\request.py", line 1361, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "C:\<python storage location>\Python\Python36-32\lib\urllib\request.py", line 1320, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [Errno 11001] getaddrinfo failed>

1 Answer 1

2
import urllib

and use urllib.error.URLError

See reference here: https://docs.python.org/3/library/urllib.error.html

Sign up to request clarification or add additional context in comments.

4 Comments

I'm getting "NameError: name 'URLError' is not defined"?
changed the error code to include the library name in front
I'm using python 3. There is no urllib2
Ah, okay, fixed it. I needed to use urllib.error.URLError. Thanks for the help! (If you change your answer to include this and the import urllib statement, I will accept it)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.