扩展错误es6类模块问题

时间:2016-05-03 20:50:32

标签: javascript class error-handling babeljs

我有一个非常奇怪的错误。我正在尝试调试为什么我不能让这个模块es6-error与babel 6一起工作。测试仍然失败。其中一个测试非常简单,自定义错误的实例应该是一个错误。这两个都应该是app ~ HandlerT App IO

true

以下是jsbin上完全相同的console.log(err instanceof Error) console.log(err instanceof ExtendableError) 代码的示例,其中两个日志都返回src

如果将该代码放入一个节点文件并运行它,则会出现相同的行为。

很明显,测试失败的原因是模块导入不正常,这奇怪地失败了。

true

为什么当import ExtendableError from './index' var b = new ExtendableError(); console.log(b instanceof ExtendableError) // false console.log(b instanceof Error) // true 的声明与ExtendableError相同的文件中我得到console.logtrue有效行为,以及我true时1}}在它自己的文件中它变为ExtendableErrorfalse

这是output of the working babel 5 code

2 个答案:

答案 0 :(得分:0)

解决方法是停止对extends使用Babel的polyfill并自行执行扩展

class ExtendableError {
  constructor(message = '') {
    Error.call(this, message)

    // extending Error is weird and does not propagate `message`
    Object.defineProperty(this, 'message', {
      enumerable : false,
      value : message,
      writable : true,
    });

    Object.defineProperty(this, 'name', {
      enumerable : false,
      value : this.constructor.name,
      writable : true,
    });

    if (Error.hasOwnProperty('captureStackTrace')) {
      Error.captureStackTrace(self, this.constructor);
      return
    }

    Object.defineProperty(this, 'stack', {
      enumerable : false,
      value : (new Error(message)).stack,
      writable : true,
    });
  }
}

ExtendableError.prototype = Object.create(Error.prototype)

var b = new ExtendableError()

console.log(b instanceof Error) // true
console.log(b instanceof ExtendableError) // true

答案 1 :(得分:0)

关注babel松弛通道,并迅速填写此插件,允许这与babel 5向后兼容。

https://github.com/loganfsmyth/babel-plugin-transform-builtin-extend

{
  ["babel-plugin-transform-builtin-extend", {
    "globals": ["Error"],
    "approximate": true
  }]
}

Here's the pr to es6-error.