[英]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.