From 5da31f8af36012a4f76c3bd0d536ae107e0519b5 Mon Sep 17 00:00:00 2001 From: Christian Becker Date: Wed, 15 Jul 2015 01:20:39 +0200 Subject: [PATCH] fix UnboundLocalError in handle_url_build_error - caused by changes in the execution model of python 3 where the alias of an except clause is cleared on exit of the except --- flask/app.py | 5 +++-- flask/testsuite/basic.py | 11 +++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/flask/app.py b/flask/app.py index cc3fc1d9..e073798a 100644 --- a/flask/app.py +++ b/flask/app.py @@ -1631,8 +1631,9 @@ class Flask(_PackageBoundObject): rv = handler(error, endpoint, values) if rv is not None: return rv - except BuildError as error: - pass + except BuildError as e: + # make error available outside except block (py3) + error = e # At this point we want to reraise the exception. If the error is # still the same one we can reraise it with the original traceback, diff --git a/flask/testsuite/basic.py b/flask/testsuite/basic.py index 31fade13..803a008c 100644 --- a/flask/testsuite/basic.py +++ b/flask/testsuite/basic.py @@ -772,6 +772,17 @@ class BasicFunctionalityTestCase(FlaskTestCase): with app.test_request_context(): self.assert_equal(flask.url_for('spam'), '/test_handler/') + def test_build_error_handler_reraise(self): + app = flask.Flask(__name__) + + # Test a custom handler which reraises the BuildError + def handler_raises_build_error(error, endpoint, values): + raise error + app.url_build_error_handlers.append(handler_raises_build_error) + + with app.test_request_context(): + self.assertRaises(BuildError, flask.url_for, 'not.existing') + def test_custom_converters(self): from werkzeug.routing import BaseConverter class ListConverter(BaseConverter):