Почему console.log показывает свойства ошибки? - PullRequest
0 голосов
/ 17 января 2020
class AppError extends Error {
    constructor(cause, name, ...args) {
        const message = args.map(x => x.toString()).join(" ")
        super(message)
        this.name = name
        Error.captureStackTrace(this, AppError)
    }
}

throw new AppError(null, "name", "my", "message")

Когда я выкидываю ошибку, вывод выглядит следующим образом:

throw new AppError(null, "name", "my", "message")
^

name: my message
    at Object.<anonymous> (/home/xxx/test.js:21:7)
    at Module._compile (internal/modules/cjs/loader.js:959:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)
    at Function.Module._load (internal/modules/cjs/loader.js:727:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10)
    at internal/main/run_main_module.js:17:11 {
  name: 'name'
}

Почему он показывает {name: 'name'}?

Но когда я выбрасываю обычный Error объект, он выглядит так:

throw new Error("message")
^

Error: message
    at Object.<anonymous> (/home/xxx/test.js:21:7)
    at Module._compile (internal/modules/cjs/loader.js:959:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)
    at Function.Module._load (internal/modules/cjs/loader.js:727:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10)
    at internal/main/run_main_module.js:17:11

Он не показывает {name: "name or something"}

Я использую node ./test.js запустить этот файл.

1 Ответ

1 голос
/ 17 января 2020

Ваше AppError присвоило экземпляру свойство name:

this.name = name

Вы ничего не назначаете простой старой Error. Если вы действительно назначите такое свойство, вы сможете увидеть его:

const err = new Error('errormessage');
err.name = 'someerrorname';
throw err;

приводит к

someerrorname: errormessage
    at Object.<anonymous> (D:\Javascript\...\foo.js:1:13)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
    at internal/main/run_main_module.js:17:11 {
  name: 'someerrorname'
}

(В противном случае, что предшествует : по умолчанию будет Error)

То же самое относится и к интерфейсу:

const err = new Error('errormessage');
err.name = 'someerrorname';
throw err;

Uncaught someerrorname: errormessage

(без присвоения err.name, вместо этого вы получите Uncaught Error)

Если вы хотите удалить {name: 'name'}, сделайте свойство не перечисляемым:

Object.defineProperty(this, 'name', { value: name, enumerable: false });

При регистрации объекта перечисляемые свойства будут перечислены на нем.

(Вы можете также опустите enumerable: false, если хотите, так как по умолчанию оно равно false)

...