嗅探 Python urllib2.httperror 内容并将其传递

Sniffing Python urllib2.httperror content and passing it along

在一些 python 代码中,我使用一个库来包装对 Web 服务的请求。我想要的行为是任何 HTTPError 的内容输出都带有 logging.error 以及状态代码,并且传递错误:

def my_request_thing(api, other_stuff):
  request = make_request_from(api, other_stuff)
  try:
    with closing(urllib2.urlopen(request)) as fd:
      return fd.read()
  except HTTPError as e:
    logging.error("Error from server: %s\n%s", e.code, e.read())
    raise

此代码将记录并传递错误,有一个问题,异常内容已在 e.read 中耗尽。此代码旨在用于 API 的大多数客户端替换根路径和 http headers... 然后我可能会有另一个功能来使用这个更多领域特定的东西:

function get_my_thing(thing_id, conditions):
  try:
    return json.loads(my_request_thing(<thing_id + conditions into api and stuff...>))
  except HTTPError as e:
    if e.code == 404 and "my thing does not exist" in e.read():
      return False
    else:
      raise e

请注意,这也会尝试使用 e.read 获取数据 - 现在为空,并且可能仍会重新引发错误。这将无法工作 - e.read 这里没有数据。

有没有什么好的方法可以重新引发此异常,使内容不会耗尽,但我可以嗅出特定的异常类型并在途中将它们全部记录下来?

根据 评论,您为什么不在第一次看到 e.read() 的结果时将其作为数据成员注入到异常中?

例如,从带有空 self.content 的 HTTPError 导出您自己的错误 class。第一次捕获异常时,填充self.content from self.read(). Next handlers can inspect e.content