From 1d4448abe335741c61b3c8c5f99e1607a13f7e3d Mon Sep 17 00:00:00 2001 From: Diggory Blake Date: Fri, 31 Mar 2017 17:07:43 +0100 Subject: [PATCH] Handle BaseExceptions (#2222) * Handle BaseExceptions * Add test and changes * Make test more idiomatic --- CHANGES | 3 +++ flask/app.py | 3 +++ tests/test_basic.py | 17 +++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/CHANGES b/CHANGES index 7c50d0c7..6933c0c9 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,9 @@ Major release, unreleased - Change default configuration `JSONIFY_PRETTYPRINT_REGULAR=False`. jsonify() method returns compressed response by default, and pretty response in debug mode. +- Call `ctx.auto_pop` with the exception object instead of `None`, in the + event that a `BaseException` such as `KeyboardInterrupt` is raised in a + request handler. Version 0.12.1 -------------- diff --git a/flask/app.py b/flask/app.py index c8540b5f..6617b02b 100644 --- a/flask/app.py +++ b/flask/app.py @@ -1991,6 +1991,9 @@ class Flask(_PackageBoundObject): except Exception as e: error = e response = self.handle_exception(e) + except: + error = sys.exc_info()[1] + raise return response(environ, start_response) finally: if self.should_ignore_error(error): diff --git a/tests/test_basic.py b/tests/test_basic.py index 942eb0f6..ffc12dc1 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -791,6 +791,23 @@ def test_error_handling_processing(): assert resp.data == b'internal server error' +def test_baseexception_error_handling(): + app = flask.Flask(__name__) + app.config['LOGGER_HANDLER_POLICY'] = 'never' + + @app.route('/') + def broken_func(): + raise KeyboardInterrupt() + + with app.test_client() as c: + with pytest.raises(KeyboardInterrupt): + c.get('/') + + ctx = flask._request_ctx_stack.top + assert ctx.preserved + assert type(ctx._preserved_exc) is KeyboardInterrupt + + def test_before_request_and_routing_errors(): app = flask.Flask(__name__)