все Python 3urllib.requestпонятие
urllib.request.HTTPDefaultErrorHandler
ошибки и перенаправления
Последнее звено обработки HTTP-ошибок: превращает всё, что не обработали другие, в urllib.error.HTTPError.
Синтаксис
urllib.request.HTTPDefaultErrorHandler()
Из-за него urlopen() не возвращает ответ 404 или 500, а бросает исключение. Тело ошибки при этом не потеряно: e.read() и e.code работают, потому что HTTPError сам является ответом. Чтобы получать такие ответы как обычные, подменяют его наследником с методом http_error_default, возвращающим fp.
Примеры
import email.message, io, urllib.error, urllib.request, urllib.response
def reply(req, code, body=b'', **headers):
msg = email.message.Message()
for name, value in headers.items():
msg[name.replace('_', '-')] = value
resp = urllib.response.addinfourl(io.BytesIO(body), msg, req.full_url, code)
resp.msg = 'demo'
return resp
class Server(urllib.request.BaseHandler):
handler_order = 100
def http_open(self, req):
return reply(req, 404, b'not here')
try:
urllib.request.build_opener(Server).open('http://example.com/x')
except urllib.error.HTTPError as e:
print(e.code, e.read()) # → 404 b'not here'
import email.message, io, urllib.error, urllib.request, urllib.response
def reply(req, code, body=b'', **headers):
msg = email.message.Message()
for name, value in headers.items():
msg[name.replace('_', '-')] = value
resp = urllib.response.addinfourl(io.BytesIO(body), msg, req.full_url, code)
resp.msg = 'demo'
return resp
class Server(urllib.request.BaseHandler):
handler_order = 100
def http_open(self, req):
return reply(req, 500, b'oops')
class Keep(urllib.request.HTTPDefaultErrorHandler):
def http_error_default(self, req, fp, code, msg, hdrs):
return fp
resp = urllib.request.build_opener(Server, Keep).open('http://example.com/x')
print(resp.status, resp.read()) # → 500 b'oops'
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности