Skip to content

Commit

Permalink
errors: improve the description of ERR_INVALID_ARG_VALUE
Browse files Browse the repository at this point in the history
- Allow user to customize why the argument is invalid
- Display the argument with util.inspect so null bytes can be
  displayed properly.

Backport-PR-URL: #18916
PR-URL: #18358
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Jon Moss <me@jonathanmoss.me>
  • Loading branch information
joyeecheung authored and MylesBorins committed Feb 26, 2018
1 parent 28fa906 commit b3fe55a
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 7 deletions.
22 changes: 17 additions & 5 deletions lib/internal/errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,13 @@ const { kMaxLength } = process.binding('buffer');
const { defineProperty } = Object;

// Lazily loaded
var util = null;
var util_ = null;
function lazyUtil() {
if (!util_) {
util_ = require('util');
}
return util_;
}

function makeNodeError(Base) {
return class NodeError extends Base {
Expand Down Expand Up @@ -68,11 +74,11 @@ class AssertionError extends Error {
if (message) {
super(message);
} else {
const util = lazyUtil();
if (actual && actual.stack && actual instanceof Error)
actual = `${actual.name}: ${actual.message}`;
if (expected && expected.stack && expected instanceof Error)
expected = `${expected.name}: ${expected.message}`;
if (util === null) util = require('util');
super(`${util.inspect(actual).slice(0, 128)} ` +
`${operator} ${util.inspect(expected).slice(0, 128)}`);
}
Expand Down Expand Up @@ -107,7 +113,7 @@ function message(key, args) {
if (typeof msg === 'function') {
fmt = msg;
} else {
if (util === null) util = require('util');
const util = lazyUtil();
fmt = util.format;
if (args === undefined || args.length === 0)
return msg;
Expand Down Expand Up @@ -263,8 +269,14 @@ E('ERR_INSPECTOR_CLOSED', 'Session was closed');
E('ERR_INSPECTOR_NOT_AVAILABLE', 'Inspector is not available');
E('ERR_INSPECTOR_NOT_CONNECTED', 'Session is not connected');
E('ERR_INVALID_ARG_TYPE', invalidArgType);
E('ERR_INVALID_ARG_VALUE', (name, value) =>
`The value "${String(value)}" is invalid for argument "${name}"`);
E('ERR_INVALID_ARG_VALUE', (name, value, reason = 'is invalid') => {
const util = lazyUtil();
let inspected = util.inspect(value);
if (inspected.length > 128) {
inspected = inspected.slice(0, 128) + '...';
}
return `The argument '${name}' ${reason}. Received ${inspected}`;
}),
E('ERR_INVALID_ARRAY_LENGTH',
(name, len, actual) => {
internalAssert(typeof actual === 'number', 'actual must be a number');
Expand Down
14 changes: 12 additions & 2 deletions test/parallel/test-internal-errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -334,10 +334,20 @@ assert.strictEqual(
}

{
const error = new errors.Error('ERR_INVALID_ARG_VALUE', 'foo', 'bar');
const error = new errors.Error('ERR_INVALID_ARG_VALUE', 'foo', '\u0000bar');
assert.strictEqual(
error.message,
'The value "bar" is invalid for argument "foo"'
'The argument \'foo\' is invalid. Received \'\\u0000bar\''
);
}

{
const error = new errors.Error(
'ERR_INVALID_ARG_VALUE',
'foo', { a: 1 }, 'must have property \'b\'');
assert.strictEqual(
error.message,
'The argument \'foo\' must have property \'b\'. Received { a: 1 }'
);
}

Expand Down

0 comments on commit b3fe55a

Please sign in to comment.