From a94804cd4e0ed3e5784ace0dfac512ce3cd9e3ea Mon Sep 17 00:00:00 2001 From: Ram Rachum Date: Sat, 20 Jun 2020 11:34:21 +0300 Subject: [PATCH] Fix exception causes all over the codebase --- ChangeLog | 2 ++ astroid/brain/brain_builtin_inference.py | 38 ++++++++++++------------ astroid/brain/brain_namedtuple_enum.py | 18 +++++------ astroid/brain/brain_random.py | 4 +-- astroid/brain/brain_six.py | 4 +-- astroid/decorators.py | 4 +-- astroid/protocols.py | 4 +-- astroid/scoped_nodes.py | 2 +- 8 files changed, 39 insertions(+), 37 deletions(-) diff --git a/ChangeLog b/ChangeLog index cb92a70d11..7972d69ef7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -23,6 +23,8 @@ Release Date: TBA Close PyCQA/pylint#3583 +* Fixed exception-chaining error messages. + What's New in astroid 2.4.3? ============================ diff --git a/astroid/brain/brain_builtin_inference.py b/astroid/brain/brain_builtin_inference.py index 4b07ac5c0b..f3b4c155c7 100644 --- a/astroid/brain/brain_builtin_inference.py +++ b/astroid/brain/brain_builtin_inference.py @@ -165,13 +165,13 @@ def _container_generic_inference(node, context, node_type, transform): if not transformed: try: inferred = next(arg.infer(context=context)) - except (InferenceError, StopIteration): - raise UseInferenceDefault() + except (InferenceError, StopIteration) as exc: + raise UseInferenceDefault from exc if inferred is util.Uninferable: - raise UseInferenceDefault() + raise UseInferenceDefault transformed = transform(inferred) if not transformed or transformed is util.Uninferable: - raise UseInferenceDefault() + raise UseInferenceDefault return transformed @@ -267,8 +267,8 @@ def _get_elts(arg, context): is_iterable = lambda n: isinstance(n, (nodes.List, nodes.Tuple, nodes.Set)) try: inferred = next(arg.infer(context)) - except (InferenceError, NameInferenceError): - raise UseInferenceDefault() + except (InferenceError, NameInferenceError) as exc: + raise UseInferenceDefault from exc if isinstance(inferred, nodes.Dict): items = inferred.items elif is_iterable(inferred): @@ -371,12 +371,12 @@ def infer_super(node, context=None): else: try: mro_pointer = next(node.args[0].infer(context=context)) - except InferenceError: - raise UseInferenceDefault + except InferenceError as exc: + raise UseInferenceDefault from exc try: mro_type = next(node.args[1].infer(context=context)) - except InferenceError: - raise UseInferenceDefault + except InferenceError as exc: + raise UseInferenceDefault from exc if mro_pointer is util.Uninferable or mro_type is util.Uninferable: # No way we could understand this. @@ -397,8 +397,8 @@ def _infer_getattr_args(node, context): try: obj = next(node.args[0].infer(context=context)) attr = next(node.args[1].infer(context=context)) - except InferenceError: - raise UseInferenceDefault + except InferenceError as exc: + raise UseInferenceDefault from exc if obj is util.Uninferable or attr is util.Uninferable: # If one of the arguments is something we can't infer, @@ -437,8 +437,8 @@ def infer_getattr(node, context=None): # Try to infer the default and return it instead. try: return next(node.args[2].infer(context=context)) - except InferenceError: - raise UseInferenceDefault + except InferenceError as exc: + raise UseInferenceDefault from exc raise UseInferenceDefault @@ -505,8 +505,8 @@ def infer_property(node, context=None): getter = node.args[0] try: inferred = next(getter.infer(context=context)) - except InferenceError: - raise UseInferenceDefault + except InferenceError as exc: + raise UseInferenceDefault from exc if not isinstance(inferred, (nodes.FunctionDef, nodes.Lambda)): raise UseInferenceDefault @@ -673,12 +673,12 @@ def infer_isinstance(callnode, context=None): class_container = _class_or_tuple_to_container( class_or_tuple_node, context=context ) - except InferenceError: - raise UseInferenceDefault + except InferenceError as exc: + raise UseInferenceDefault from exc try: isinstance_bool = helpers.object_isinstance(obj_node, class_container, context) except AstroidTypeError as exc: - raise UseInferenceDefault("TypeError: " + str(exc)) + raise UseInferenceDefault("TypeError: " + str(exc)) from exc except MroError as exc: raise UseInferenceDefault from exc if isinstance_bool is util.Uninferable: diff --git a/astroid/brain/brain_namedtuple_enum.py b/astroid/brain/brain_namedtuple_enum.py index 13fcf793f7..c0aa1c2b0e 100644 --- a/astroid/brain/brain_namedtuple_enum.py +++ b/astroid/brain/brain_namedtuple_enum.py @@ -51,8 +51,8 @@ def _infer_first(node, context): raise UseInferenceDefault() else: return value - except StopIteration: - raise InferenceError() + except StopIteration as exc: + raise InferenceError from exc def _find_func_form_arguments(node, context): @@ -88,7 +88,7 @@ def infer_func_form(node, base_type, context=None, enum=False): name, names = _find_func_form_arguments(node, context) try: attributes = names.value.replace(",", " ").split() - except AttributeError: + except AttributeError as exc: if not enum: attributes = [ _infer_first(const, context).value for const in names.elts @@ -117,11 +117,11 @@ def infer_func_form(node, base_type, context=None, enum=False): _infer_first(const, context).value for const in names.elts ] else: - raise AttributeError + raise AttributeError from exc if not attributes: - raise AttributeError - except (AttributeError, exceptions.InferenceError): - raise UseInferenceDefault() + raise AttributeError from exc + except (AttributeError, exceptions.InferenceError) as exc: + raise UseInferenceDefault from exc attributes = [attr for attr in attributes if " " not in attr] @@ -405,8 +405,8 @@ def infer_typing_namedtuple(node, context=None): # so we extract the args and infer a named tuple. try: func = next(node.func.infer()) - except InferenceError: - raise UseInferenceDefault + except InferenceError as exc: + raise UseInferenceDefault from exc if func.qname() != "typing.NamedTuple": raise UseInferenceDefault diff --git a/astroid/brain/brain_random.py b/astroid/brain/brain_random.py index 5ec858a1c4..ee116474b2 100644 --- a/astroid/brain/brain_random.py +++ b/astroid/brain/brain_random.py @@ -47,8 +47,8 @@ def infer_random_sample(node, context=None): try: elts = random.sample(inferred_sequence.elts, length.value) - except ValueError: - raise astroid.UseInferenceDefault + except ValueError as exc: + raise astroid.UseInferenceDefault from exc new_node = astroid.List( lineno=node.lineno, col_offset=node.col_offset, parent=node.scope() diff --git a/astroid/brain/brain_six.py b/astroid/brain/brain_six.py index 46d9fa3290..1519d5859f 100644 --- a/astroid/brain/brain_six.py +++ b/astroid/brain/brain_six.py @@ -145,8 +145,8 @@ def _six_fail_hook(modname): attribute = modname[start_index:].lstrip(".").replace(".", "_") try: import_attr = module.getattr(attribute)[0] - except AttributeInferenceError: - raise AstroidBuildingError(modname=modname) + except AttributeInferenceError as exc: + raise AstroidBuildingError(modname=modname) from exc if isinstance(import_attr, nodes.Import): submodule = MANAGER.ast_from_module_name(import_attr.names[0][0]) return submodule diff --git a/astroid/decorators.py b/astroid/decorators.py index 0f3632c48d..8db0868e15 100644 --- a/astroid/decorators.py +++ b/astroid/decorators.py @@ -134,9 +134,9 @@ def raise_if_nothing_inferred(func, instance, args, kwargs): # generator is empty if error.args: # pylint: disable=not-a-mapping - raise exceptions.InferenceError(**error.args[0]) + raise exceptions.InferenceError(**error.args[0]) from error raise exceptions.InferenceError( "StopIteration raised without any error information." - ) + ) from error yield from generator diff --git a/astroid/protocols.py b/astroid/protocols.py index 2cdf5548be..dc66ca2cd0 100644 --- a/astroid/protocols.py +++ b/astroid/protocols.py @@ -498,8 +498,8 @@ def _infer_context_manager(self, mgr, context): elif isinstance(inferred, bases.Instance): try: enter = next(inferred.igetattr("__enter__", context=context)) - except (exceptions.InferenceError, exceptions.AttributeInferenceError): - raise exceptions.InferenceError(node=inferred) + except (exceptions.InferenceError, exceptions.AttributeInferenceError) as exc: + raise exceptions.InferenceError(node=inferred) from exc if not isinstance(enter, bases.BoundMethod): raise exceptions.InferenceError(node=enter) yield from enter.infer_call_result(self, context) diff --git a/astroid/scoped_nodes.py b/astroid/scoped_nodes.py index 8561e745a0..5c94196689 100644 --- a/astroid/scoped_nodes.py +++ b/astroid/scoped_nodes.py @@ -2571,7 +2571,7 @@ def igetattr(self, name, context=None, class_context=True): else: raise exceptions.InferenceError( error.message, target=self, attribute=name, context=context - ) + ) from error def has_dynamic_getattr(self, context=None): """Check if the class has a custom __getattr__ or __getattribute__.