我试图用ES6和Babel扩展Error . 它没有成功 .
class MyError extends Error {
constructor(m) {
super(m);
}
}
var error = new Error("ll");
var myerror = new MyError("ll");
console.log(error.message) //shows up correctly
console.log(myerror.message) //shows empty string
Error对象永远不会获得正确的消息集 .
现在我已经在SO(for example here)上看到了一些解决方案,但它们看起来都非常非ES6-y . 如何以漂亮的ES6方式做到这一点? (那是在Babel工作)
11 回答
基于KarelBílek's answer, I' d对
constructor
做一个小改动:这将在堆栈中打印
MyError
,而不是通用Error
.它还会将错误消息添加到堆栈跟踪中 - 这是Karel示例中缺少的 .
如果它可用,它也将使用
captureStackTrace
.使用Babel 6,你需要transform-builtin-extend(npm)才能工作 .
最后让这个休息 . 在Babel 6中明确表示开发人员不支持从内置扩展 . 尽管这个技巧对
Map
,Set
等内容没有帮助,但它确实适用于Error
. 这很重要,因为可以引发异常的语言的核心思想之一是允许自定义错误 . 这是非常重要的,因为Promises变得更有用,因为它们被设计为reject an Error .可悲的事实是,你仍然需要在ES2015中以旧方式执行此操作 .
Example in Babel REPL
自定义错误模式
另一方面,有一个Babel 6的插件允许这个 .
https://www.npmjs.com/package/babel-plugin-transform-builtin-extend
Update: (截至2016-09-29)经过一些测试后,看来babel.io没有正确解释所有断言(从自定义扩展错误扩展) . 但在Ember.JS扩展错误按预期工作:https://ember-twiddle.com/d88555a6f408174df0a4c8e0fd6b27ce
随着babel 6的最新变化,我发现transform-builtin-extend不再有效 . 我最终使用这种混合方法:
和
结果所有这些测试通过:
鉴于此接受的答案不再有效,您可以随时使用工厂作为替代方案(repl):
除了@zangw的答案,你可以像这样定义你的错误:
这将抛出正确的名称,消息和堆栈跟踪:
正如@sukima所提到的,你无法扩展原生JS . OP的问题无法回答 .
与Melbourne2991's answer相似,我确实使用了工厂,但是遵循MDN's recommendation for customer error types .
Quoting
虽然上述代码无法输出堆栈跟踪,除非在Babel中调用
this.stack = (new Error()).stack;
或Error.captureStackTrace(this, this.constructor.name);
. 国际海事组织,这可能是一个问题 .实际上,可以使用此代码片段在
Chrome console
和Node.js v4.2.1
下输出堆栈跟踪 .输出
Chrome console
.输出
Node.js
结合this answer,this answer和this code,我已经制作了这个小的"helper"类,看起来效果很好 .
Try in REPL
Edit :Typescript 2.1中的重大变化
编辑Lee Benson原创回答对我来说有点作用 . 这也为实例添加了
stack
和ExtendableError
类的其他方法 .class MyError extends Error {…}
语法是正确的 .请注意,转换器仍然存在继承内置对象的问题 . 在你的情况下,
似乎解决了这个问题 .
不使用Babel,但在普通的ES6中,以下似乎对我很好:
从REPL测试:
如您所见,堆栈包含错误名称和消息 . 我不确定我是否遗漏了什么,但所有其他答案似乎都过于复杂 .