diff --git a/IPython/html/services/notebooks/filenbmanager.py b/IPython/html/services/notebooks/filenbmanager.py index 3c14909..ddb6835 100644 --- a/IPython/html/services/notebooks/filenbmanager.py +++ b/IPython/html/services/notebooks/filenbmanager.py @@ -146,8 +146,9 @@ class FileNotebookManager(NotebookManager): try: # v1 and v2 and json in the .ipynb files. nb = current.reads(s, u'json') - except Exception as e: - raise web.HTTPError(500, u'Unreadable JSON notebook: %s' % e) + except ValueError as e: + msg = u"Unreadable Notebook: %s" % e + raise web.HTTPError(400, msg, reason=msg) return last_modified, nb def read_notebook_object(self, notebook_id): diff --git a/IPython/html/static/notebook/js/notebook.js b/IPython/html/static/notebook/js/notebook.js index 08981fb..52bfdc7 100644 --- a/IPython/html/static/notebook/js/notebook.js +++ b/IPython/html/static/notebook/js/notebook.js @@ -1794,20 +1794,20 @@ var IPython = (function (IPython) { * @param {String} errorThrow HTTP error message */ Notebook.prototype.load_notebook_error = function (xhr, textStatus, errorThrow) { - if (xhr.status === 500) { - var msg = "An error occurred while loading this notebook. Most likely " + - "this notebook is in a newer format than is supported by this " + - "version of IPython. This version can load notebook formats " + - "v"+this.nbformat+" or earlier."; - - IPython.dialog.modal({ - title: "Error loading notebook", - body : msg, - buttons : { - "OK": {} - } - }); + if (xhr.status === 400) { + var msg = errorThrow; + } else if (xhr.status === 500) { + var msg = "An unknown error occurred while loading this notebook. " + + "This version can load notebook formats " + + "v" + this.nbformat + " or earlier."; } + IPython.dialog.modal({ + title: "Error loading notebook", + body : msg, + buttons : { + "OK": {} + } + }); } /********************* checkpoint-related *********************/ diff --git a/IPython/nbformat/current.py b/IPython/nbformat/current.py index 6f89356..f5862bf 100644 --- a/IPython/nbformat/current.py +++ b/IPython/nbformat/current.py @@ -40,14 +40,19 @@ current_nbformat = nbformat current_nbformat_minor = nbformat_minor +class NBFormatError(ValueError): + pass -class NBFormatError(Exception): +class NotJSONError(ValueError): pass def parse_json(s, **kwargs): """Parse a string into a (nbformat, dict) tuple.""" - d = json.loads(s, **kwargs) + try: + d = json.loads(s, **kwargs) + except ValueError: + raise NotJSONError("Notebook does not appear to be JSON: %r" % s[:16]) nbf = d.get('nbformat', 1) nbm = d.get('nbformat_minor', 0) return nbf, nbm, d @@ -82,7 +87,7 @@ def reads_json(s, **kwargs): nb = v3.to_notebook_json(d, **kwargs) nb = v3.convert_to_this_nbformat(nb, orig_version=3, orig_minor=minor) else: - raise NBFormatError('Unsupported JSON nbformat version: %i' % nbf) + raise NBFormatError('Unsupported JSON nbformat version %s (supported version: %i)' % (nbf, 3)) return nb