705a0f5838
Python frames in mixed stack traces were missing file name and pointed to a line below correct position Change-Id: I335292f40b3b6ea3dbca80b84f1d8dbed9a6581d Fixes: bug #1331113
83 lines
2.6 KiB
Python
83 lines
2.6 KiB
Python
# Copyright (c) 2014 Mirantis, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import sys
|
|
|
|
import murano.dsl.yaql_functions as yaql_functions
|
|
|
|
|
|
class MuranoPlException(Exception):
|
|
def __init__(self, names, message, stacktrace, extra=None, cause=None):
|
|
super(MuranoPlException, self).__init__(
|
|
'[{0}]: {1}'.format(', '.join(names), message))
|
|
if not isinstance(names, list):
|
|
names = [names]
|
|
self._names = names
|
|
self._message = message
|
|
self._stacktrace = stacktrace
|
|
self._extra = extra or {}
|
|
self._cause = cause
|
|
|
|
@property
|
|
def names(self):
|
|
return self._names
|
|
|
|
@property
|
|
def message(self):
|
|
return self._message
|
|
|
|
@property
|
|
def stacktrace(self):
|
|
return self._stacktrace
|
|
|
|
@property
|
|
def extra(self):
|
|
return self._extra
|
|
|
|
@property
|
|
def cause(self):
|
|
return self._cause
|
|
|
|
@staticmethod
|
|
def from_python_exception(exception, context):
|
|
stacktrace = yaql_functions.new('io.murano.StackTrace', context)
|
|
exception_type = type(exception)
|
|
names = ['{0}.{1}'.format(exception_type.__module__,
|
|
exception_type.__name__)]
|
|
|
|
result = MuranoPlException(
|
|
names, str(exception), stacktrace)
|
|
exc_type, exc_value, exc_traceback = sys.exc_info()
|
|
result.original_exception = exception
|
|
result.original_traceback = exc_traceback
|
|
return result
|
|
|
|
def _format_name(self):
|
|
if not self._names:
|
|
return ''
|
|
elif len(self._names) == 1:
|
|
return self._names[0]
|
|
else:
|
|
return self._names
|
|
|
|
def format(self, prefix=''):
|
|
text = '{3}{0}: {1}\n' \
|
|
'{3}Traceback (most recent call last):\n' \
|
|
'{2}'.format(self._format_name(), self.message,
|
|
self.stacktrace.toString(prefix + ' '), prefix)
|
|
if self._cause is not None:
|
|
text += '\n\n{0} Caused by {1}'.format(
|
|
prefix, self._cause.format(prefix + ' ').lstrip())
|
|
return text
|