Search code examples
pythonexceptionurllib2

Get URL when handling urllib2.URLError


This pertains to urllib2 specifically, but custom exception handling more generally. How do I pass additional information to a calling function in another module via a raised exception? I'm assuming I would re-raise using a custom exception class, but I'm not sure of the technical details.

Rather than pollute the sample code with what I've tried and failed, I'll simply present it as a mostly blank slate. My end goal is for the last line in the sample to work.

#mymod.py
import urllib2

def openurl():
    req = urllib2.Request("http://duznotexist.com/")
    response = urllib2.urlopen(req)

#main.py
import urllib2
import mymod

try:
    mymod.openurl()
except urllib2.URLError as e:
    #how do I do this?
    print "Website (%s) could not be reached due to %s" % (e.url, e.reason)

Solution

  • You can add information to and then re-raise the exception.

    #mymod.py
    import urllib2
    
    def openurl():
        req = urllib2.Request("http://duznotexist.com/")
        try:
            response = urllib2.urlopen(req)
        except urllib2.URLError as e:
            # add URL and reason to the exception object
            e.url = "http://duznotexist.com/"
            e.reason = "URL does not exist"
            raise e # re-raise the exception, so the calling function can catch it
    
    #main.py
    import urllib2
    import mymod
    
    try:
        mymod.openurl()
    except urllib2.URLError as e:
        print "Website (%s) could not be reached due to %s" % (e.url, e.reason)