我想抓住并重新提出异常,这是我能够做到的。但问题是,重新加注后显示的痕迹并不像未捕获时那样详细。
另一个奇怪的事情是sys.exc_info()[2]
,我用于追溯只显示外层跟踪并且不在图书馆内挖掘。而当我使用traceback.format_exc()
时,它只显示库中的跟踪。我想要两条痕迹,如果我没有捕获并重新加注,它实际上会抛出。
这就是我在做的事情:
def raise_location_suggest_error(function):
def wrap_exceptions(*args, **kwargs):
try:
return function(*args, **kwargs)
except Exception, e:
# print traceback.format_exc()
raise (LocationSuggestError(str(e)), None, sys.exc_info()[2])
return wrap_exceptions
@raise_location_suggest_error
def error_throwing_method():
# some error thrown
上面的堆栈跟踪是:
Traceback (most recent call last):
File "/nail/home/prateek/pg/foo-main/foo/web/base_cmd.py", line 453, in run
return self.execute()
File "/nail/home/prateek/pg/foo-main/cmds/_request_mapper.py", line 400, in execute
return action(**match)
File "/nail/home/prateek/pg/foo-main/cmds/location_suggest.py", line 28, in json_suggestions
return LocationSuggest(self).json_suggestions()
File "/nail/home/prateek/pg/foo-main/foo/web/cmd_helpers/location_suggest.py", line 45, in json_suggestions
_, suggestions = self.get_suggestions()
File "/nail/home/prateek/pg/foo-main/foo/web/cmd_helpers/location_suggest.py", line 81, in get_suggestions
.suggest(prefix, country, state, city, recent_locations, exps)
File "/nail/home/prateek/pg/foo-main/virtualenv_run/lib/python2.6/site-packages/foo_clientlib/decorators/clog_call.py", line 108, in wrapper
result = method(given_self, *args, **kwargs)
File "/nail/home/prateek/pg/foo-main/foo/component/search/location_suggest.py", line 113, in suggest
None, sys.exc_info()[2])
取消注释print traceback.format_exc()
会给出:
File "/nail/home/prateek/pg/foo-main/foo/component/search/location_suggest.py", line 105, in suggest
AsynchronousHttpClient(headers=self._headers))
File "/nail/home/prateek/pg/foo-main/virtualenv_run/lib/python2.6/site-packages/swaggerpy/client.py", line 110, in get_client
return factory(*args, **kwargs).swagger_client
File "/nail/home/prateek/pg/foo-main/virtualenv_run/lib/python2.6/site-packages/swaggerpy/client.py", line 71, in __call__
**kwargs)
File "/nail/home/prateek/pg/foo-main/virtualenv_run/lib/python2.6/site-packages/swaggerpy/client.py", line 79, in build_cached_client
return CachedClient(SwaggerClient(*args, **kwargs), timeout)
File "/nail/home/prateek/pg/foo-main/virtualenv_run/lib/python2.6/site-packages/swaggerpy/client.py", line 287, in __init__
self._api_docs = loader.load_resource_listing(url_or_resource)
File "/nail/home/prateek/pg/foo-main/virtualenv_run/lib/python2.6/site-packages/swaggerpy/swagger_model.py", line 160, in load_resource_listing
resource_listing = json_load_url(self.http_client, resources_url)
File "/nail/home/prateek/pg/foo-main/virtualenv_run/lib/python2.6/site-packages/swaggerpy/swagger_model.py", line 122, in json_load_url
resp.raise_for_status()
File "/nail/home/prateek/pg/foo-main/virtualenv_run/lib/python2.6/site-packages/requests/models.py", line 725, in raise_for_status
raise HTTPError(http_error_msg, response=self)
删除装饰器@raise_location_suggest_error
基本上给出了第一个和第二个回溯的连接,这就是我想要的。我该怎么做才能重新加注并获得完整的堆栈跟踪?我使用的是Python 2.7
答案 0 :(得分:0)
我的结局是一个愚蠢的错误。 sys.exc_info
甚至没有将raise
跟踪作为第三个参数读取。 raise a, b, c
与raise(a, b, c)
不同。如果需要分成两行,请使用\
而不是应用括号。改为raise a, b, c
解决了我的问题。