From 389e2a07e676e5be3b8cbd94f0a0f7ebccb47f47 Mon Sep 17 00:00:00 2001 From: koichik Date: Fri, 9 Sep 2011 01:16:48 +0900 Subject: [PATCH] util: Fix inspection for Error Fixes #1634. --- lib/util.js | 28 ++++++++++++++++++++++++++-- test/simple/test-util-inspect.js | 18 ++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/lib/util.js b/lib/util.js index 84833d3..5e4f1a6 100644 --- a/lib/util.js +++ b/lib/util.js @@ -185,6 +185,9 @@ function formatValue(ctx, value, recurseTimes) { if (isDate(value)) { return ctx.stylize(value.toUTCString(), 'date'); } + if (isError(value)) { + return formatError(value); + } } var base = '', array = false, braces = ['{', '}']; @@ -211,6 +214,11 @@ function formatValue(ctx, value, recurseTimes) { base = ' ' + value.toUTCString(); } + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } @@ -264,6 +272,11 @@ function formatPrimitive(ctx, value) { } +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { @@ -374,13 +387,24 @@ function isArray(ar) { function isRegExp(re) { return re instanceof RegExp || - (typeof re === 'object' && Object.prototype.toString.call(re) === '[object RegExp]'); + (typeof re === 'object' && objectToString(re) === '[object RegExp]'); } function isDate(d) { return d instanceof Date || - (typeof d === 'object' && Object.prototype.toString.call(d) === '[object Date]'); + (typeof d === 'object' && objectToString(d) === '[object Date]'); +} + + +function isError(e) { + return e instanceof Error || + (typeof e === 'object' && objectToString(e) === '[object Error]'); +} + + +function objectToString(o) { + return Object.prototype.toString.call(o); } diff --git a/test/simple/test-util-inspect.js b/test/simple/test-util-inspect.js index 36884e2..f37ef93 100644 --- a/test/simple/test-util-inspect.js +++ b/test/simple/test-util-inspect.js @@ -41,3 +41,21 @@ delete a[1]; assert.equal(util.inspect(a), "[ 'foo', , 'baz' ]"); assert.equal(util.inspect(a, true), "[ 'foo', , 'baz', [length]: 3 ]"); assert.equal(util.inspect(new Array(5)), '[ , , , , ]'); + +// exceptions should print the error message, not "{}" +assert.equal(util.inspect(new Error()), '[Error]'); +assert.equal(util.inspect(new Error('FAIL')), '[Error: FAIL]'); +assert.equal(util.inspect(new TypeError('FAIL')), '[TypeError: FAIL]'); +assert.equal(util.inspect(new SyntaxError('FAIL')), '[SyntaxError: FAIL]'); +try { + undef(); +} catch (e) { + assert.equal(util.inspect(e), '[ReferenceError: undef is not defined]'); +} +var ex = util.inspect(new Error('FAIL'), true); +console.log(ex); +assert.ok(ex.indexOf("[Error: FAIL]") != -1); +assert.ok(ex.indexOf("[stack]") != -1); +assert.ok(ex.indexOf("[message]") != -1); +assert.ok(ex.indexOf("[arguments]") != -1); +assert.ok(ex.indexOf("[type]") != -1); -- 2.7.4