summaryrefslogtreecommitdiffstats
path: root/nova/exception.py
diff options
context:
space:
mode:
authorAlex Meade <alex.meade@rackspace.com>2012-05-03 14:29:50 -0400
committerAlex Meade <alex.meade@rackspace.com>2012-05-07 10:38:28 -0400
commit2f552e957fddcd9e042a09a2d32d32fa564c18e7 (patch)
treeba2914fb539f0143e90cb3fbb921cb67623f4762 /nova/exception.py
parenteb9e54c1129080ad0f5b569b39dfa09c539f2f11 (diff)
Replaces exceptions.Error with NovaException
Fixes bug 817107 Change-Id: I6253e6bbcc44676c587b315fa32afba6459e676a
Diffstat (limited to 'nova/exception.py')
-rw-r--r--nova/exception.py97
1 files changed, 45 insertions, 52 deletions
diff --git a/nova/exception.py b/nova/exception.py
index df2f79e3d..e2760b68d 100644
--- a/nova/exception.py
+++ b/nova/exception.py
@@ -31,6 +31,7 @@ import sys
import webob.exc
from nova import log as logging
+from nova.openstack.common import excutils
LOG = logging.getLogger(__name__)
@@ -62,28 +63,6 @@ class ProcessExecutionError(IOError):
IOError.__init__(self, message)
-class Error(Exception):
- pass
-
-
-class EC2APIError(Error):
- def __init__(self, message='Unknown', code=None):
- self.msg = message
- self.code = code
- if code:
- outstr = '%s: %s' % (code, message)
- else:
- outstr = '%s' % message
- super(EC2APIError, self).__init__(outstr)
-
-
-class DBError(Error):
- """Wraps an implementation specific exception."""
- def __init__(self, inner_exception=None):
- self.inner_exception = inner_exception
- super(DBError, self).__init__(str(inner_exception))
-
-
def wrap_db_error(f):
def _wrap(*args, **kwargs):
try:
@@ -113,36 +92,30 @@ def wrap_exception(notifier=None, publisher_id=None, event_type=None,
try:
return f(*args, **kw)
except Exception, e:
- # Save exception since it can be clobbered during processing
- # below before we can re-raise
- exc_info = sys.exc_info()
-
- if notifier:
- payload = dict(args=args, exception=e)
- payload.update(kw)
-
- # Use a temp vars so we don't shadow
- # our outer definitions.
- temp_level = level
- if not temp_level:
- temp_level = notifier.ERROR
-
- temp_type = event_type
- if not temp_type:
- # If f has multiple decorators, they must use
- # functools.wraps to ensure the name is
- # propagated.
- temp_type = f.__name__
-
- context = get_context_from_function_and_args(f,
- args,
- kw)
-
- notifier.notify(context, publisher_id, temp_type,
- temp_level, payload)
-
- # re-raise original exception since it may have been clobbered
- raise exc_info[0], exc_info[1], exc_info[2]
+ with excutils.save_and_reraise_exception():
+ if notifier:
+ payload = dict(args=args, exception=e)
+ payload.update(kw)
+
+ # Use a temp vars so we don't shadow
+ # our outer definitions.
+ temp_level = level
+ if not temp_level:
+ temp_level = notifier.ERROR
+
+ temp_type = event_type
+ if not temp_type:
+ # If f has multiple decorators, they must use
+ # functools.wraps to ensure the name is
+ # propagated.
+ temp_type = f.__name__
+
+ context = get_context_from_function_and_args(f,
+ args,
+ kw)
+
+ notifier.notify(context, publisher_id, temp_type,
+ temp_level, payload)
return functools.wraps(f)(wrapped)
return inner
@@ -183,6 +156,26 @@ class NovaException(Exception):
super(NovaException, self).__init__(message)
+class EC2APIError(NovaException):
+ message = _("Unknown")
+
+ def __init__(self, message=None, code=None):
+ self.msg = message
+ self.code = code
+ if code:
+ outstr = '%s: %s' % (code, message)
+ else:
+ outstr = '%s' % message
+ super(EC2APIError, self).__init__(outstr)
+
+
+class DBError(NovaException):
+ """Wraps an implementation specific exception."""
+ def __init__(self, inner_exception=None):
+ self.inner_exception = inner_exception
+ super(DBError, self).__init__(str(inner_exception))
+
+
class DecryptionFailure(NovaException):
message = _("Failed to decrypt text")