在JavaScript中扩展错误的好方法是什么?
2022-08-29 23:13:07
我想在我的JS代码中加入一些东西,我希望它们是Error的实例,但我也想让它们成为其他东西。
在Python中,通常,人们会子类 Exception。
在JS中做什么合适的事情?
我想在我的JS代码中加入一些东西,我希望它们是Error的实例,但我也想让它们成为其他东西。
在Python中,通常,人们会子类 Exception。
在JS中做什么合适的事情?
在 ES6 中:
class MyError extends Error {
constructor(message) {
super(message);
this.name = 'MyError';
}
}
Error 对象具有的唯一标准字段是属性。(参见 MDN 或 EcmaScript Language Specification, section 15.11)其他所有内容都是特定于平台的。message
大多数环境设置了该属性,但实际上在继承中使用是无用的。stack
fileName
lineNumber
因此,极简主义方法是:
function MyError(message) {
this.name = 'MyError';
this.message = message;
this.stack = (new Error()).stack;
}
MyError.prototype = new Error; // <-- remove this if you do not
// want MyError to be instanceof Error
您可以嗅探堆栈,从中取消移动不需要的元素并提取文件名和lineNumber等信息,但这样做需要有关JavaScript当前运行的平台的信息。大多数情况下,这些都是不必要的 -- 如果你真的想要的话,你可以在事后分析中这样做。
Safari是一个值得注意的例外。没有属性,但有关键字集和正在引发的对象的属性。这些事情保证是正确的。stack
throw
sourceURL
line
我使用的测试用例可以在这里找到:JavaScript自制的错误对象比较。