From f79ccf452b7a0cbf51c63adf259f46896586dc16 Mon Sep 17 00:00:00 2001 From: Sergey Vilgelm Date: Mon, 24 Jun 2013 13:41:07 +0400 Subject: Do not raise NEW exceptions Raising NEW exception is bad practice, because we lose TraceBack. So all places like: except SomeException as e: raise e should be replaced by except SomeException: raise If we are doing some other actions before reraising we should store information about exception then do all actions and then reraise it. This is caused by eventlet bug. It lost information about exception if it switch threads. fixes bug 1191730 Change-Id: I8dffc36ba5780911dd57d7161d218d0324af60b3 --- keystone/auth/token_factory.py | 9 +++++---- keystone/exception.py | 4 ++-- keystone/token/controllers.py | 9 +++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/keystone/auth/token_factory.py b/keystone/auth/token_factory.py index 64f945fa..fd44b637 100644 --- a/keystone/auth/token_factory.py +++ b/keystone/auth/token_factory.py @@ -17,6 +17,7 @@ """Token Factory""" import json +import sys import uuid import webob @@ -338,14 +339,14 @@ def create_token(context, auth_context, auth_info): token_data=token_data, trust_id=trust['id'] if trust else None) token_api.create_token(context, token_id, data) - except Exception as e: + except Exception: + exc_info = sys.exc_info() # an identical token may have been created already. # if so, return the token_data as it is also identical try: - token_api.get_token(context=context, - token_id=token_id) + token_api.get_token(context=context, token_id=token_id) except exception.TokenNotFound: - raise e + raise exc_info[0], exc_info[1], exc_info[2] return (token_id, token_data) diff --git a/keystone/exception.py b/keystone/exception.py index 39a08d4a..db5f5005 100644 --- a/keystone/exception.py +++ b/keystone/exception.py @@ -40,10 +40,10 @@ class Error(StandardError): try: message = self._build_message(message, **kwargs) - except KeyError as e: + except KeyError: # if you see this warning in your logs, please raise a bug report if _FATAL_EXCEPTION_FORMAT_ERRORS: - raise e + raise else: LOG.warning('missing exception kwargs (programmer error)') message = self.__doc__ diff --git a/keystone/token/controllers.py b/keystone/token/controllers.py index 68a3ebcd..9e19c9cb 100644 --- a/keystone/token/controllers.py +++ b/keystone/token/controllers.py @@ -1,4 +1,5 @@ import json +import sys import uuid from keystone.common import cms @@ -134,14 +135,14 @@ class Auth(controller.V2Controller): tenant=tenant_ref, metadata=metadata_ref, trust_id=trust_id)) - except Exception as e: + except Exception: + exc_info = sys.exc_info() # an identical token may have been created already. # if so, return the token_data as it is also identical try: - self.token_api.get_token(context=context, - token_id=token_id) + self.token_api.get_token(context=context, token_id=token_id) except exception.TokenNotFound: - raise e + raise exc_info[0], exc_info[1], exc_info[2] token_data['access']['token']['id'] = token_id -- cgit