From cded90efe310ddffb6750f117dba2d974c6ae392 Mon Sep 17 00:00:00 2001 From: MinRK Date: Mon, 7 Oct 2013 12:14:43 -0700 Subject: [PATCH] update json_errors decorator separate handling of HTTPError and unhanded exceptions --- IPython/html/base/handlers.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/IPython/html/base/handlers.py b/IPython/html/base/handlers.py index cd4e8d49f..d66137d0d 100644 --- a/IPython/html/base/handlers.py +++ b/IPython/html/base/handlers.py @@ -272,7 +272,7 @@ class AuthenticatedFileHandler(IPythonHandler, web.StaticFileHandler): def json_errors(method): """Decorate methods with this to return GitHub style JSON errors. - This should be used on any handler method that can raise HTTPErrors. + This should be used on any JSON API on any handler method that can raise HTTPErrors. This will grab the latest HTTPError exception using sys.exc_info and then: @@ -285,18 +285,20 @@ def json_errors(method): def wrapper(self, *args, **kwargs): try: result = method(self, *args, **kwargs) - except: + except web.HTTPError as e: + status = e.status_code + message = e.log_message + self.set_status(e.status_code) + self.finish(json.dumps(dict(message=message))) + except Exception: + self.log.error("Unhandled error in API request", exc_info=True) + status = 500 + message = "Unknown server error" t, value, tb = sys.exc_info() - if isinstance(value, web.HTTPError): - status = value.status_code - message = value.log_message - else: - status = 400 - message = u"Unknown server error" self.set_status(status) tb_text = ''.join(traceback.format_exception(t, value, tb)) reply = dict(message=message, traceback=tb_text) - self.finish(json.dumps(reply, default=date_default)) + self.finish(json.dumps(reply)) else: return result return wrapper