From 2ed8bad8afda3096019946c03e118e7aea766ff7 Mon Sep 17 00:00:00 2001 From: David Halter Date: Fri, 14 Dec 2012 12:04:30 +0100 Subject: [PATCH] move MultiLevel exceptions to common --- jedi/common.py | 26 ++++++++++++++++++++++++++ jedi/evaluate.py | 32 +++----------------------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/jedi/common.py b/jedi/common.py index e188f781..dcf92c3d 100644 --- a/jedi/common.py +++ b/jedi/common.py @@ -6,6 +6,32 @@ import debug import settings +class MultiLevelStopIteration(Exception): + """ + StopIteration's get catched pretty easy by for loops, let errors propagate. + """ + pass + + +class MultiLevelAttributeError(Exception): + """ + Important, because `__getattr__` and `hasattr` catch AttributeErrors + implicitly. This is really evil (mainly because of `__getattr__`). + `hasattr` in Python 2 is even more evil, because it catches ALL exceptions. + Therefore this class has to be a `BaseException` and not an `Exception`. + But because I rewrote hasattr, we can now switch back to `Exception`. + + :param base: return values of sys.exc_info(). + """ + def __init__(self, base): + self.base = base + + def __str__(self): + import traceback + tb = traceback.format_exception(*self.base) + return 'Original:\n\n' + ''.join(tb) + + class PushBackIterator(object): def __init__(self, iterator): self.pushes = [] diff --git a/jedi/evaluate.py b/jedi/evaluate.py index 3bba6ebf..f0474552 100644 --- a/jedi/evaluate.py +++ b/jedi/evaluate.py @@ -36,32 +36,6 @@ class DecoratorNotFound(LookupError): pass -class MultiLevelStopIteration(Exception): - """ - StopIteration's get catched pretty easy by for loops, let errors propagate. - """ - pass - - -class MultiLevelAttributeError(Exception): - """ - Important, because `__getattr__` and `hasattr` catch AttributeErrors - implicitly. This is really evil (mainly because of `__getattr__`). - `hasattr` in Python 2 is even more evil, because it catches ALL exceptions. - Therefore this class has to be a `BaseException` and not an `Exception`. - But because I rewrote hasattr, we can now switch back to `Exception`. - - :param base: return values of sys.exc_info(). - """ - def __init__(self, base): - self.base = base - - def __str__(self): - import traceback - tb = traceback.format_exception(*self.base) - return 'Original:\n\n' + ''.join(tb) - - class Executable(parsing.Base): """ An instance is also an executable - because __init__ is called """ def __init__(self, base, var_args=None): @@ -694,7 +668,7 @@ class Execution(Executable): copied.parent = self._scope_copy(copied.parent) return copied except AttributeError: - raise MultiLevelAttributeError(sys.exc_info()) + raise common.MultiLevelAttributeError(sys.exc_info()) @property @cache.memoize_default() @@ -927,7 +901,7 @@ def get_names_for_scope(scope, position=None, star_search=True, yield scope, get_defined_names_for_position(scope, position, in_func_scope) except StopIteration: - raise MultiLevelStopIteration('StopIteration raised somewhere') + raise common.MultiLevelStopIteration('StopIteration raised') if scope.isinstance(parsing.ForFlow) and scope.is_list_comp: # is a list comprehension yield scope, scope.get_set_vars(is_internal_call=True) @@ -1333,7 +1307,7 @@ def follow_statement(stmt, seek_name=None): except AttributeError: # This is so evil! But necessary to propagate errors. The attribute # errors here must not be catched, because they shouldn't exist. - raise MultiLevelAttributeError(sys.exc_info()) + raise common.MultiLevelAttributeError(sys.exc_info()) # Assignment checking is only important if the statement defines multiple # variables.