diff --git a/src/flask/app.py b/src/flask/app.py index 301694ac..9097c464 100644 --- a/src/flask/app.py +++ b/src/flask/app.py @@ -1621,7 +1621,7 @@ class Flask(Scaffold): except ImportError: raise RuntimeError( "Install Flask with the 'async' extra in order to use async views." - ) + ) from None # Check that Werkzeug isn't using its fallback ContextVar class. if ContextVar.__module__ == "werkzeug.local": @@ -1727,7 +1727,7 @@ class Flask(Scaffold): " response. The return type must be a string," " dict, tuple, Response instance, or WSGI" f" callable, but it was a {type(rv).__name__}." - ).with_traceback(sys.exc_info()[2]) + ).with_traceback(sys.exc_info()[2]) from None else: raise TypeError( "The view function did not return a valid" diff --git a/src/flask/cli.py b/src/flask/cli.py index 0d101d0a..7ab4fa1c 100644 --- a/src/flask/cli.py +++ b/src/flask/cli.py @@ -69,15 +69,16 @@ def find_best_app(script_info, module): if isinstance(app, Flask): return app - except TypeError: + except TypeError as e: if not _called_with_wrong_args(app_factory): raise + raise NoAppException( f"Detected factory {attr_name!r} in module {module.__name__!r}," " but could not call it without arguments. Use" f" \"FLASK_APP='{module.__name__}:{attr_name}(args)'\"" " to specify arguments." - ) + ) from e raise NoAppException( "Failed to find Flask application or factory in module" @@ -161,7 +162,7 @@ def find_app_by_string(script_info, module, app_name): except SyntaxError: raise NoAppException( f"Failed to parse {app_name!r} as an attribute name or function call." - ) + ) from None if isinstance(expr, ast.Name): name = expr.id @@ -184,7 +185,7 @@ def find_app_by_string(script_info, module, app_name): # message with the full expression instead. raise NoAppException( f"Failed to parse arguments as literal values: {app_name!r}." - ) + ) from None else: raise NoAppException( f"Failed to parse {app_name!r} as an attribute name or function call." @@ -192,17 +193,17 @@ def find_app_by_string(script_info, module, app_name): try: attr = getattr(module, name) - except AttributeError: + except AttributeError as e: raise NoAppException( f"Failed to find attribute {name!r} in {module.__name__!r}." - ) + ) from e # If the attribute is a function, call it with any args and kwargs # to get the real application. if inspect.isfunction(attr): try: app = call_factory(script_info, attr, args, kwargs) - except TypeError: + except TypeError as e: if not _called_with_wrong_args(attr): raise @@ -210,7 +211,7 @@ def find_app_by_string(script_info, module, app_name): f"The factory {app_name!r} in module" f" {module.__name__!r} could not be called with the" " specified arguments." - ) + ) from e else: app = attr @@ -257,16 +258,15 @@ def locate_app(script_info, module_name, app_name, raise_if_not_found=True): try: __import__(module_name) - except ImportError: + except ImportError as e: # Reraise the ImportError if it occurred within the imported module. # Determine this by checking whether the trace has a depth > 1. if sys.exc_info()[2].tb_next: raise NoAppException( - f"While importing {module_name!r}, an ImportError was" - f" raised:\n\n{traceback.format_exc()}" - ) + f"While importing {module_name!r}, an ImportError was raised." + ) from e elif raise_if_not_found: - raise NoAppException(f"Could not import {module_name!r}.") + raise NoAppException(f"Could not import {module_name!r}.") from e else: return @@ -725,7 +725,7 @@ class CertParamType(click.ParamType): "Using ad-hoc certificates requires the cryptography library.", ctx, param, - ) + ) from None return value diff --git a/src/flask/debughelpers.py b/src/flask/debughelpers.py index ce65c487..212f7d7e 100644 --- a/src/flask/debughelpers.py +++ b/src/flask/debughelpers.py @@ -83,10 +83,11 @@ def attach_enctype_error_multidict(request): def __getitem__(self, key): try: return oldcls.__getitem__(self, key) - except KeyError: + except KeyError as e: if key not in request.form: raise - raise DebugFilesKeyError(request, key) + + raise DebugFilesKeyError(request, key) from e newcls.__name__ = oldcls.__name__ newcls.__module__ = oldcls.__module__ diff --git a/src/flask/scaffold.py b/src/flask/scaffold.py index 42eabcfc..07ca5c65 100644 --- a/src/flask/scaffold.py +++ b/src/flask/scaffold.py @@ -715,7 +715,7 @@ class Scaffold: f"'{code_or_exception}' is not a recognized HTTP error" " code. Use a subclass of HTTPException with that code" " instead." - ) + ) from None self.error_handler_spec[None][code][exc_class] = t.cast( "ErrorHandlerCallable[Exception]", f diff --git a/src/flask/signals.py b/src/flask/signals.py index 63667bdb..2c6d6469 100644 --- a/src/flask/signals.py +++ b/src/flask/signals.py @@ -29,7 +29,7 @@ except ImportError: raise RuntimeError( "Signalling support is unavailable because the blinker" " library is not installed." - ) + ) from None connect = connect_via = connected_to = temporarily_connected_to = _fail disconnect = _fail