def test_create_formatted_exception(self): from chameleon.utils import create_formatted_exception exc = create_formatted_exception(NameError('foo'), NameError, str) self.assertEqual(exc.args, ('foo', )) class MyNameError(NameError): def __init__(self, boo): NameError.__init__(self, boo) self.bar = boo exc = create_formatted_exception(MyNameError('foo'), MyNameError, str) self.assertEqual(exc.args, ('foo', )) self.assertEqual(exc.bar, 'foo')
def test_create_formatted_exception_no_subclass(self): from chameleon.utils import create_formatted_exception class DifficultMetaClass(type): def __init__(self, class_name, bases, namespace): if not bases == (BaseException, ): raise TypeError(bases) Difficult = DifficultMetaClass('Difficult', (BaseException, ), {'args': ()}) exc = create_formatted_exception(Difficult(), Difficult, str) self.assertEqual(exc.args, ())
def render(self, **__kw): econtext = Scope(__kw) rcontext = {} self.cook_check() stream = self.output_stream_factory() try: self._render(stream, econtext, rcontext) except LookupError: cls, exc, tb = sys.exc_info() print cls print exc print tb except: cls, exc, tb = sys.exc_info() print cls print exc print tb errors = rcontext.get('__error__') print errors if errors: formatter = exc.__str__ if isinstance(formatter, ExceptionFormatter): if errors is not formatter._errors: formatter._errors.extend(errors) raise formatter = ExceptionFormatter(errors, econtext, rcontext) try: exc = create_formatted_exception(exc, cls, formatter) except TypeError: pass raise_with_traceback(exc, tb) raise return join(stream)