为什么console.log显示错误的属性?

问题描述 投票:0回答:1
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运行此文件。

javascript node.js error-handling prototype
1个回答
1
投票

您的AppError为实例分配了name属性:

this.name = name

尽管您没有为普通的Error分配任何内容。如果您do分配了这样的属性,则可以看到它:

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;

未捕获的某个错误名称:errormessage

((不分配给err.name,则得到Uncaught Error

如果要删除{name: 'name'},请将该属性设置为不可枚举:

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

记录对象时,将在其上列出可枚举的属性。

((如果需要,您也可以省略enumerable: false,因为它仍然默认为false

© www.soinside.com 2019 - 2024. All rights reserved.