util: Fix inspection for Error
authorkoichik <koichik@improvement.jp>
Thu, 8 Sep 2011 16:16:48 +0000 (01:16 +0900)
committerkoichik <koichik@improvement.jp>
Sun, 11 Sep 2011 14:13:06 +0000 (23:13 +0900)
Fixes #1634.

lib/util.js
test/simple/test-util-inspect.js

index 84833d3..5e4f1a6 100644 (file)
@@ -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);
 }
 
 
index 36884e2..f37ef93 100644 (file)
@@ -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);