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
分配任何内容。如果您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
)