繁体   English   中英

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

[英]Why is console.log showing properties of error?

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来运行这个文件。

您的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;

未捕获 someerrorname: errormessage

(没有分配给err.name ,你会得到Uncaught Error

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

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

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

(如果你愿意,你也可以省略enumerable: false ,因为它默认为false

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM