Skip to content

Commit

Permalink
util: improve error inspection
Browse files Browse the repository at this point in the history
When inspecting errors with extra properties while setting the
compact option to false, it will now return:

[Error: foo] {
    at repl:1:5
    at Script.runInThisContext (vm.js:89:20)
  bla: true
}

Instead of:

Error: foo
    at repl:1:5
    at Script.runInThisContext (vm.js:91:20) {
  bla: true
}

PR-URL: #20802
Refs: #20253
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
  • Loading branch information
BridgeAR authored and MylesBorins committed May 22, 2018
1 parent f0d6a37 commit c8c9211
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 4 deletions.
8 changes: 7 additions & 1 deletion lib/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -597,7 +597,8 @@ function formatValue(ctx, value, recurseTimes) {
// Make error with message first say the error
base = formatError(value);
// Wrap the error in brackets in case it has no stack trace.
if (base.indexOf('\n at') === -1) {
const stackStart = base.indexOf('\n at');
if (stackStart === -1) {
base = `[${base}]`;
}
// The message and the stack have to be indented as well!
Expand All @@ -607,6 +608,11 @@ function formatValue(ctx, value, recurseTimes) {
}
if (keyLength === 0)
return base;

if (ctx.compact === false && stackStart !== -1) {
braces[0] += `${base.slice(stackStart)}`;
base = `[${base.slice(0, stackStart)}]`;
}
} else if (isAnyArrayBuffer(value)) {
// Fast path for ArrayBuffer and SharedArrayBuffer.
// Can't do the same for DataView because it has a non-primitive
Expand Down
2 changes: 1 addition & 1 deletion test/parallel/test-repl-underscore.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ function testError() {

// The error, both from the original throw and the `_error` echo.
'Error: foo',
'Error: foo',
'[Error: foo]',

// The sync error, with individual property echoes
/Error: ENOENT: no such file or directory, scandir '.*nonexistent.*'/,
Expand Down
42 changes: 40 additions & 2 deletions test/parallel/test-util-inspect.js
Original file line number Diff line number Diff line change
Expand Up @@ -519,11 +519,49 @@ assert.strictEqual(util.inspect(-5e-324), '-5e-324');
const tmp = Error.stackTraceLimit;
Error.stackTraceLimit = 0;
const err = new Error('foo');
assert.strictEqual(util.inspect(err), '[Error: foo]');
const err2 = new Error('foo\nbar');
assert.strictEqual(util.inspect(err, { compact: true }), '[Error: foo]');
assert(err.stack);
delete err.stack;
assert(!err.stack);
assert.strictEqual(util.inspect(err), '[Error: foo]');
assert.strictEqual(util.inspect(err, { compact: true }), '[Error: foo]');
assert.strictEqual(
util.inspect(err2, { compact: true }),
'[Error: foo\nbar]'
);

err.bar = true;
err2.bar = true;

assert.strictEqual(
util.inspect(err, { compact: true }),
'{ [Error: foo] bar: true }'
);
assert.strictEqual(
util.inspect(err2, { compact: true }),
'{ [Error: foo\nbar] bar: true }'
);
assert.strictEqual(
util.inspect(err, { compact: true, breakLength: 5 }),
'{ [Error: foo]\n bar: true }'
);
assert.strictEqual(
util.inspect(err, { compact: true, breakLength: 1 }),
'{ [Error: foo]\n bar:\n true }'
);
assert.strictEqual(
util.inspect(err2, { compact: true, breakLength: 5 }),
'{ [Error: foo\nbar]\n bar: true }'
);
assert.strictEqual(
util.inspect(err, { compact: false }),
'[Error: foo] {\n bar: true\n}'
);
assert.strictEqual(
util.inspect(err2, { compact: false }),
'[Error: foo\nbar] {\n bar: true\n}'
);

Error.stackTraceLimit = tmp;
}

Expand Down

0 comments on commit c8c9211

Please sign in to comment.