errors: add useOriginalName to internal/errors

This allows us to tell the type of the errors without using
instanceof, which is necessary in WPT harness.

PR-URL: https://github.com/nodejs/node/pull/22556
Reviewed-By: John-David Dalton <john.david.dalton@gmail.com>
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Refael Ackermann <refack@gmail.com>
This commit is contained in:
Joyee Cheung 2018-08-28 03:57:23 +08:00
parent ab5f789e3f
commit e692a09802
No known key found for this signature in database
GPG Key ID: 92B78A53C8303B8D
2 changed files with 46 additions and 1 deletions

View File

@ -151,6 +151,8 @@ function makeSystemErrorWithCode(key) {
};
}
let useOriginalName = false;
function makeNodeErrorWithCode(Base, key) {
return class NodeError extends Base {
constructor(...args) {
@ -158,6 +160,9 @@ function makeNodeErrorWithCode(Base, key) {
}
get name() {
if (useOriginalName) {
return super.name;
}
return `${super.name} [${key}]`;
}
@ -437,7 +442,12 @@ module.exports = {
getMessage,
SystemError,
codes,
E // This is exported only to facilitate testing.
// This is exported only to facilitate testing.
E,
// This allows us to tell the type of the errors without using
// instanceof, which is necessary in WPT harness.
get useOriginalName() { return useOriginalName; },
set useOriginalName(value) { useOriginalName = value; }
};
// To declare an error message, use the E(sym, val, def) function above. The sym

View File

@ -0,0 +1,35 @@
// Flags: --expose-internals
'use strict';
// This tests `internal/errors.useOriginalName`
// This testing feature is needed to allows us to assert the types of
// errors without using instanceof, which is necessary in WPT harness.
// Refs: https://github.com/nodejs/node/pull/22556
require('../common');
const assert = require('assert');
const errors = require('internal/errors');
errors.E('TEST_ERROR_1', 'Error for testing purposes: %s',
Error);
{
const err = new errors.codes.TEST_ERROR_1('test');
assert(err instanceof Error);
assert.strictEqual(err.name, 'Error [TEST_ERROR_1]');
}
{
errors.useOriginalName = true;
const err = new errors.codes.TEST_ERROR_1('test');
assert(err instanceof Error);
assert.strictEqual(err.name, 'Error');
}
{
errors.useOriginalName = false;
const err = new errors.codes.TEST_ERROR_1('test');
assert(err instanceof Error);
assert.strictEqual(err.name, 'Error [TEST_ERROR_1]');
}