From 8d169900c633a3dc87b5e7bb1f9dfc397eb8d7d2 Mon Sep 17 00:00:00 2001 From: Sahab Yazdani Date: Mon, 4 Jul 2011 14:17:53 -0400 Subject: [PATCH] Reimplement error handling to use accepted JS practices wrt exception handling. --- mustache.js | 43 +++++++++++++++++++++++-------------------- test/unit.js | 2 +- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/mustache.js b/mustache.js index 8579d8d..722d069 100644 --- a/mustache.js +++ b/mustache.js @@ -133,9 +133,12 @@ var Mustache = (function(undefined) { function is_array(a) { return Object.prototype.toString.call(a) === '[object Array]'; } - - function create_error(metrics, message) { - var str = '', err; + + var MustacheError = function(message, metrics) { + var str = ''; + + this.prototype = Error.prototype; + this.name = 'MustacheError'; if (metrics) { str = '(' + metrics.line + ',' + metrics.character + '): '; @@ -144,15 +147,13 @@ var Mustache = (function(undefined) { } } - err = new Error(str + message); + this.message = str + message; if (metrics) { - err.line = metrics.line; - err.character = metrics.character; - err.partial = metrics.partial; + this.line = metrics.line; + this.character = metrics.character; + this.partial = metrics.partial; } - - return err; - } + }; /* END Helpers */ @@ -187,7 +188,7 @@ var Mustache = (function(undefined) { } if (state.parser === scan_section_parser && !state.terminated) { - throw create_error(state.metrics, 'Closing section tag "' + state.section.variable + '" expected.'); + throw new MustacheError('Closing section tag "' + state.section.variable + '" expected.', state.metrics); } if (!noReturn) { @@ -284,7 +285,7 @@ var Mustache = (function(undefined) { for (i=0, n=optionPairs.length; i': partial, @@ -521,7 +522,7 @@ var Mustache = (function(undefined) { } if (fragment.indexOf(' ')!==-1) { - throw create_error(state.metrics, 'Malformed variable name "' + fragment + '".'); + throw new MustacheError('Malformed variable name "' + fragment + '".', state.metrics); } return fragment; @@ -531,7 +532,7 @@ var Mustache = (function(undefined) { var matches = token.match(new RegExp(escape_regex(state.openTag) + '=(\\S*?)\\s*(\\S*?)=' + escape_regex(state.closeTag))); if ((matches || []).length!==3) { - throw create_error(state.metrics, 'Malformed change delimiter token "' + token + '".'); + throw new MustacheError('Malformed change delimiter token "' + token + '".', state.metrics); } var new_state = create_compiler_state( @@ -592,14 +593,14 @@ var Mustache = (function(undefined) { state.section.child_sections.pop(); state.section.template_buffer.push(token); } else { - throw create_error(state.metrics, 'Unexpected section end tag "' + variable + '", expected "' + child_section + '".'); + throw new MustacheError('Unexpected section end tag "' + variable + '", expected "' + child_section + '".', state.metrics); } } else if (state.section.variable===variable) { section(state); delete state.section; state.parser = default_parser; } else { - throw create_error(state.metrics, 'Unexpected section end tag "' + variable + '", expected "' + state.section.variable + '".'); + throw new MustacheError('Unexpected section end tag "' + variable + '", expected "' + state.section.variable + '".', state.metrics); } } @@ -644,6 +645,8 @@ var Mustache = (function(undefined) { return o.join(''); } } - } + }, + + Error: MustacheError }); })(); diff --git a/test/unit.js b/test/unit.js index 2c82be4..d1bd0c4 100644 --- a/test/unit.js +++ b/test/unit.js @@ -52,7 +52,7 @@ test("Parser", function() { {} ); }, function(e) { - return e.message === '(1,1): Malformed change delimiter token "{{=tag1}}".'; + return e instanceof Mustache.Error && e.message === '(1,1): Malformed change delimiter token "{{=tag1}}".'; }, 'Malformed tags should be handled correctly.' );