>>> import StringIO >>> from mechanize import _opener, HTTPError Normal case. Response goes through hook function and is returned. >>> def urlopen(fullurl, data=None, timeout=None): ... print "fullurl %r" % fullurl ... print "data %r" % data ... return "response" >>> def response_hook(response): ... print "response %r" % response ... return "processed response" >>> _opener.wrapped_open(urlopen, response_hook, ... "http://example.com", "data" ... ) fullurl 'http://example.com' data 'data' response 'response' 'processed response' Raised HTTPError exceptions still go through the response hook but the result is raised rather than returned. >>> def urlopen(fullurl, data=None, timeout=None): ... print "fullurl %r" % fullurl ... print "data %r" % data ... raise HTTPError( ... "http://example.com", 200, "OK", {}, StringIO.StringIO()) >>> def response_hook(response): ... print "response class", response.__class__.__name__ ... return Exception("processed response") >>> try: ... _opener.wrapped_open(urlopen, response_hook, ... "http://example.com", "data" ... ) ... except Exception, exc: ... print exc fullurl 'http://example.com' data 'data' response class HTTPError processed response Other exceptions get ignored, since they're not response objects. >>> def urlopen(fullurl, data=None, timeout=None): ... print "fullurl %r" % fullurl ... print "data %r" % data ... raise Exception("not caught") >>> try: ... _opener.wrapped_open(urlopen, response_hook, ... "http://example.com", "data" ... ) ... except Exception, exc: ... print exc fullurl 'http://example.com' data 'data' not caught