Estoy tratando de extender Error con ES6 y Babel. No está funcionando.
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 stringEl objeto Error nunca recibe el conjunto de mensajes correcto.
Ahora he visto algunas soluciones en SO ( por ejemplo, aquí ), pero todas parecen muy diferentes a ES6. ¿Cómo hacerlo de una manera agradable, ES6? (Eso es trabajar en Babel)
Según la respuesta de Karel Bílek, haría un pequeño cambio en el constructor :
class ExtendableError extends Error { constructor(message) { super(message); this.name = this.constructor.name; if (typeof Error.captureStackTrace === 'function') { Error.captureStackTrace(this, this.constructor); } else { this.stack = (new Error(message)).stack; } } } // now I can extend class MyError extends ExtendableError {} var myerror = new MyError("ll"); console.log(myerror.message); console.log(myerror instanceof Error); console.log(myerror.name); console.log(myerror.stack); Esto imprimirá MyError en la pila, y no el Error genérico.
También agregará el mensaje de error al seguimiento de la pila, que faltaba en el ejemplo de Karel.
También usará captureStackTrace si está disponible.
Con Babel 6, necesita transform-built-in- exten ( npm ) para que esto funcione.
Combinando esta respuesta , esta respuesta y este código , he creado esta pequeña clase de "ayuda", que parece funcionar bien.
class ExtendableError extends Error { constructor(message) { super(); this.message = message; this.stack = (new Error()).stack; this.name = this.constructor.name; } } // now I can extend class MyError extends ExtendableError { constructor(m) { super(m); } } var myerror = new MyError("ll"); console.log(myerror.message); console.log(myerror instanceof Error); console.log(myerror.name); console.log(myerror.stack);Para finalmente poner esto a descansar. En Babel 6 es explícito que los desarrolladores no soportan la extensión desde la versión integrada. Aunque este truco no ayudará con cosas como Map , Set , etc., sí funciona para Error . Esto es importante ya que una de las ideas centrales de un lenguaje que puede generar una excepción es permitir errores personalizados. Esto es doblemente importante ya que las Promesas se vuelven más útiles ya que están diseñadas para rechazar un Error .
La triste verdad es que aún necesita realizar esto a la antigua en ES2015.
class MyError { constructor(message) { this.name = 'MyError'; this.message = message; this.stack = new Error().stack; // Optional } } MyError.prototype = Object.create(Error.prototype);Por otro lado, hay un complemento para Babel 6 que permite esto.
https://www.npmjs.com/package/babel-plugin-transform-builtin-extend
Actualización: (a partir del 29 de septiembre de 2016) Después de algunas pruebas, parece que babel.io no tiene en cuenta correctamente todas las afirmaciones (que se extienden desde un error extendido personalizado). Pero en Ember.JS, el error de extensión funciona como se esperaba: https://ember-twiddle.com/d88555a6f408174df0a4c8e0fd6b27ce