diff --git a/installsystems/exception.py b/installsystems/exception.py index fd7a959e9db387fd48195f7ed89fc678a01092e8..ff5137e70172bf12540efc53569493ebe84bb64f 100644 --- a/installsystems/exception.py +++ b/installsystems/exception.py @@ -23,27 +23,42 @@ InstallSystems Exceptions ''' -import StringIO -import sys import traceback -import installsystems +import sys class ISException(Exception): ''' Base exception class ''' + def __init__(self, message="", exception=None): self.message = unicode(message) - self.exception = exception - if exception: - self.exc_info = sys.exc_info() + self.exception = None if exception is None else sys.exc_info() def __str__(self): - if self.exception: - return u"%s: %s" % (self.message, self.exception) + ''' + Return a description of exception + ''' + if self.exception is not None: + return u"%s: %s" % (self.message, self.exception[1]) else: return self.message + def print_sub_tb(self, fd=sys.stderr): + ''' + Print stored exception traceback and exception message + ''' + # no exception, do nothing + if self.exception is None: + return + # print traceback and exception separatly to avoid recursive print of + # "Traceback (most recent call last)" from traceback.print_exception + traceback.print_tb(self.exception[2], file=fd) + fd.write("".join(traceback.format_exception_only(self.exception[0], self.exception[1]))) + # recursively call traceback print on ISException error + if isinstance(self.exception[1], ISException): + self.exception[1].print_sub_tb() + def print_tb(self, fd=sys.stderr): ''' Print traceback from embeded exception or current one @@ -51,19 +66,11 @@ class ISException(Exception): from installsystems.printer import out # coloring out("#l##B#", fd=fd, endl="") - # print original exception traceback - if self.exception is not None: - traceback.print_exception(self.exc_info[0], self.exc_info[1], - self.exc_info[2], file=fd) - # print current exception traceback - else: - exc_info = sys.exc_info() - traceback.print_exception(exc_info[0], exc_info[1], exc_info[2], - file=fd) + traceback.print_exc(file=fd) + self.print_sub_tb(fd) # reset color out("#R#", fd=fd, endl="") - class ISError(ISException): ''' Installsystems error; this exception will stop execution @@ -74,4 +81,3 @@ class ISWarning(ISException): ''' Installsystems warning; this exception do not stop execution ''' -