在某些python代码中,我使用一个库将请求包装到web服务。我打算使用的行为是,任何HTTPErrors的内容输出都带有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头之类的东西.然后,我可能会有另一个功能,用于更多特定于领域的内容,使用如下:
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中的数据。
是否有一种很好的方法来重新定义这个异常,这样内容就不会耗尽,但是这样我就可以嗅探出特定的异常类型,并将它们全部记录下来吗?
发布于 2015-07-27 23:18:41
根据Karel Kubat的注释,为什么不将来自e.read()的结果第一次作为数据成员注入到异常中呢?
例如,使用空的HTTPError从self.content派生您自己的错误类。当第一次捕获异常时,从self.read().填充self.read().下一个处理程序可以检查e.content。
https://stackoverflow.com/questions/28675751
复制相似问题