在JavaScript中扩展错误的好方法是什么?

2022-08-29 23:13:07

我想在我的JS代码中加入一些东西,我希望它们是Error的实例,但我也想让它们成为其他东西。

在Python中,通常,人们会子类 Exception。

在JS中做什么合适的事情?


答案 1

在 ES6 中:

class MyError extends Error {
  constructor(message) {
    super(message);
    this.name = 'MyError';
  }
}


答案 2

Error 对象具有的唯一标准字段是属性。(参见 MDN 或 EcmaScript Language Specification, section 15.11)其他所有内容都是特定于平台的。message

大多数环境设置了该属性,但实际上在继承中使用是无用的。stackfileNamelineNumber

因此,极简主义方法是:

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是一个值得注意的例外。没有属性,但有关键字集和正在引发的对象的属性。这些事情保证是正确的。stackthrowsourceURLline

我使用的测试用例可以在这里找到:JavaScript自制的错误对象比较