sys.exc_info在捕获和提升时没有跟踪完整的堆栈跟踪?

时间:2014-07-22 06:34:01

标签: python python-2.7 exception-handling

我想抓住并重新提出异常,这是我能够做到的。但问题是,重新加注后显示的痕迹并不像未捕获时那样详细。

另一个奇怪的事情是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

1 个答案:

答案 0 :(得分:0)

我的结局是一个愚蠢的错误。 sys.exc_info甚至没有将raise跟踪作为第三个参数读取。 raise a, b, craise(a, b, c)不同。如果需要分成两行,请使用\而不是应用括号。改为raise a, b, c解决了我的问题。