Skip to content

Commit fa3a913

Browse files
Trottbengl
authored andcommitted
lib: add internal genericNodeError() function
There are a few places in lib where `new Error()` is called and then additional properties are attached in various ways. This creates a utility function to generate the errors. PR-URL: #41879 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Tobias Nießen <[email protected]>
1 parent ba5cb89 commit fa3a913

File tree

7 files changed

+60
-50
lines changed

7 files changed

+60
-50
lines changed

lib/buffer.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ const {
2525
Array,
2626
ArrayIsArray,
2727
ArrayPrototypeForEach,
28-
Error,
2928
MathFloor,
3029
MathMin,
3130
MathTrunc,
@@ -99,7 +98,8 @@ const {
9998
ERR_MISSING_ARGS,
10099
ERR_UNKNOWN_ENCODING
101100
},
102-
hideStackFrames
101+
genericNodeError,
102+
hideStackFrames,
103103
} = require('internal/errors');
104104
const {
105105
validateArray,
@@ -1207,10 +1207,10 @@ if (internalBinding('config').hasIntl) {
12071207
return result;
12081208

12091209
const code = icuErrName(result);
1210-
// eslint-disable-next-line no-restricted-syntax
1211-
const err = new Error(`Unable to transcode Buffer [${code}]`);
1212-
err.code = code;
1213-
err.errno = result;
1210+
const err = genericNodeError(
1211+
`Unable to transcode Buffer [${code}]`,
1212+
{ code: code, errno: result }
1213+
);
12141214
throw err;
12151215
};
12161216
}

lib/child_process.js

+8-11
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ const {
3232
ArrayPrototypeSort,
3333
ArrayPrototypeSplice,
3434
ArrayPrototypeUnshift,
35-
Error,
3635
NumberIsInteger,
3736
ObjectAssign,
3837
ObjectDefineProperty,
@@ -62,6 +61,7 @@ const { Pipe, constants: PipeConstants } = internalBinding('pipe_wrap');
6261
const {
6362
AbortError,
6463
codes: errorCodes,
64+
genericNodeError,
6565
} = require('internal/errors');
6666
const {
6767
ERR_INVALID_ARG_VALUE,
@@ -395,11 +395,11 @@ function execFile(file, args = [], options, callback) {
395395
cmd += ` ${ArrayPrototypeJoin(args, ' ')}`;
396396

397397
if (!ex) {
398-
// eslint-disable-next-line no-restricted-syntax
399-
ex = new Error('Command failed: ' + cmd + '\n' + stderr);
400-
ex.killed = child.killed || killed;
401-
ex.code = code < 0 ? getSystemErrorName(code) : code;
402-
ex.signal = signal;
398+
ex = genericNodeError(`Command failed: ${cmd}\n${stderr}`, {
399+
code: code < 0 ? getSystemErrorName(code) : code,
400+
killed: child.killed || killed,
401+
signal: signal
402+
});
403403
}
404404

405405
ex.cmd = cmd;
@@ -819,16 +819,13 @@ function checkExecSyncError(ret, args, cmd) {
819819
let err;
820820
if (ret.error) {
821821
err = ret.error;
822+
ObjectAssign(err, ret);
822823
} else if (ret.status !== 0) {
823824
let msg = 'Command failed: ';
824825
msg += cmd || ArrayPrototypeJoin(args, ' ');
825826
if (ret.stderr && ret.stderr.length > 0)
826827
msg += `\n${ret.stderr.toString()}`;
827-
// eslint-disable-next-line no-restricted-syntax
828-
err = new Error(msg);
829-
}
830-
if (err) {
831-
ObjectAssign(err, ret);
828+
err = genericNodeError(msg, ret);
832829
}
833830
return err;
834831
}

lib/events.js

+5-9
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ const {
6565
ERR_OUT_OF_RANGE,
6666
ERR_UNHANDLED_ERROR
6767
},
68+
genericNodeError,
6869
} = require('internal/errors');
6970

7071
const {
@@ -597,15 +598,10 @@ function _addListener(target, type, listener, prepend) {
597598
if (m > 0 && existing.length > m && !existing.warned) {
598599
existing.warned = true;
599600
// No error code for this since it is a Warning
600-
// eslint-disable-next-line no-restricted-syntax
601-
const w = new Error('Possible EventEmitter memory leak detected. ' +
602-
`${existing.length} ${String(type)} listeners ` +
603-
`added to ${inspect(target, { depth: -1 })}. Use ` +
604-
'emitter.setMaxListeners() to increase limit');
605-
w.name = 'MaxListenersExceededWarning';
606-
w.emitter = target;
607-
w.type = type;
608-
w.count = existing.length;
601+
const w = genericNodeError(
602+
`Possible EventEmitter memory leak detected. ${existing.length} ${String(type)} listeners ` +
603+
`added to ${inspect(target, { depth: -1 })}. Use emitter.setMaxListeners() to increase limit`,
604+
{ name: 'MaxListenersExceededWarning', emitter: target, type: type, count: existing.length });
609605
process.emitWarning(w);
610606
}
611607
}

lib/internal/errors.js

+31-14
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const {
3333
MathMax,
3434
Number,
3535
NumberIsInteger,
36+
ObjectAssign,
3637
ObjectDefineProperty,
3738
ObjectDefineProperties,
3839
ObjectIsExtensible,
@@ -830,34 +831,50 @@ class AbortError extends Error {
830831
this.name = 'AbortError';
831832
}
832833
}
834+
835+
/**
836+
* This creates a generic Node.js error.
837+
*
838+
* @param {string} message The error message.
839+
* @param {object} errorProperties Object with additional properties to be added to the error.
840+
* @returns {Error}
841+
*/
842+
const genericNodeError = hideStackFrames(function genericNodeError(message, errorProperties) {
843+
// eslint-disable-next-line no-restricted-syntax
844+
const err = new Error(message);
845+
ObjectAssign(err, errorProperties);
846+
return err;
847+
});
848+
833849
module.exports = {
850+
AbortError,
834851
aggregateTwoErrors,
852+
captureLargerStackTrace,
835853
codes,
854+
connResetException,
836855
dnsException,
856+
// This is exported only to facilitate testing.
857+
E,
837858
errnoException,
838859
exceptionWithHostPort,
860+
fatalExceptionStackEnhancers,
861+
genericNodeError,
839862
getMessage,
840-
hideStackFrames,
841863
hideInternalStackFrames,
864+
hideStackFrames,
842865
isErrorStackTraceLimitWritable,
843866
isStackOverflowError,
867+
kEnhanceStackBeforeInspector,
868+
kIsNodeError,
869+
kNoOverride,
870+
maybeOverridePrepareStackTrace,
871+
overrideStackTrace,
872+
prepareStackTrace,
844873
setArrowMessage,
845-
connResetException,
874+
SystemError,
846875
uvErrmapGet,
847876
uvException,
848877
uvExceptionWithHostPort,
849-
SystemError,
850-
AbortError,
851-
// This is exported only to facilitate testing.
852-
E,
853-
kNoOverride,
854-
prepareStackTrace,
855-
maybeOverridePrepareStackTrace,
856-
overrideStackTrace,
857-
kEnhanceStackBeforeInspector,
858-
fatalExceptionStackEnhancers,
859-
kIsNodeError,
860-
captureLargerStackTrace,
861878
};
862879

863880
// To declare an error message, use the E(sym, val, def) function above. The sym

lib/net.js

+6-5
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ const {
2525
ArrayIsArray,
2626
ArrayPrototypeIndexOf,
2727
Boolean,
28-
Error,
2928
Number,
3029
NumberIsNaN,
3130
NumberParseInt,
@@ -97,7 +96,8 @@ const {
9796
},
9897
errnoException,
9998
exceptionWithHostPort,
100-
uvExceptionWithHostPort
99+
genericNodeError,
100+
uvExceptionWithHostPort,
101101
} = require('internal/errors');
102102
const { isUint8Array } = require('internal/util/types');
103103
const {
@@ -470,9 +470,10 @@ function writeAfterFIN(chunk, encoding, cb) {
470470
encoding = null;
471471
}
472472

473-
// eslint-disable-next-line no-restricted-syntax
474-
const er = new Error('This socket has been ended by the other party');
475-
er.code = 'EPIPE';
473+
const er = genericNodeError(
474+
'This socket has been ended by the other party',
475+
{ code: 'EPIPE' }
476+
);
476477
if (typeof cb === 'function') {
477478
defaultTriggerAsyncIdScope(this[async_id_symbol], process.nextTick, cb, er);
478479
}

lib/zlib.js

+3-4
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ const {
2626
ArrayPrototypeForEach,
2727
ArrayPrototypeMap,
2828
ArrayPrototypePush,
29-
Error,
3029
FunctionPrototypeBind,
3130
MathMaxApply,
3231
NumberIsFinite,
@@ -51,7 +50,8 @@ const {
5150
ERR_OUT_OF_RANGE,
5251
ERR_ZLIB_INITIALIZATION_FAILED,
5352
},
54-
hideStackFrames
53+
genericNodeError,
54+
hideStackFrames,
5555
} = require('internal/errors');
5656
const { Transform, finished } = require('stream');
5757
const {
@@ -186,8 +186,7 @@ function zlibOnError(message, errno, code) {
186186
// There is no way to cleanly recover.
187187
// Continuing only obscures problems.
188188

189-
// eslint-disable-next-line no-restricted-syntax
190-
const error = new Error(message);
189+
const error = genericNodeError(message, { errno, code });
191190
error.errno = errno;
192191
error.code = code;
193192
self.destroy(error);

test/sequential/test-child-process-execsync.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ try {
6060
assert.ok(caught, 'execSync should throw');
6161
const end = Date.now() - start;
6262
assert(end < SLEEP);
63-
assert(err.status > 128 || err.signal);
63+
assert(err.status > 128 || err.signal, `status: ${err.status}, signal: ${err.signal}`);
6464
}
6565

6666
assert.throws(function() {

0 commit comments

Comments
 (0)