Quando si esegue questo frammento attraverso BabelJS:errori estesi non hanno un messaggio o una pila di traccia
class FooError extends Error {
constructor(message) {
super(message);
}
}
let error = new FooError('foo');
console.log(error, error.message, error.stack);
essa stampa
{}
che non è quello che mi aspettavo. Esecuzione
error = new Error('foo');
console.log(error, error.message, error.stack);
produce
{} foo Error: foo
at eval (eval at <anonymous> (https://babeljs.io/scripts/repl.js?t=2015-05-21T16:46:33+00:00:263:11), <anonymous>:24:9)
at REPL.evaluate (https://babeljs.io/scripts/repl.js?t=2015-05-21T16:46:33+00:00:263:36)
at REPL.compile (https://babeljs.io/scripts/repl.js?t=2015-05-21T16:46:33+00:00:210:12)
at Array.onSourceChange (https://babeljs.io/scripts/repl.js?t=2015-05-21T16:46:33+00:00:288:12)
at u (https://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js:28:185)
che è esattamente quello che vorrei da errore esteso.
Il mio obiettivo è estendere Error
in una varietà di sottoclassi e usarle nella corrispondenza di bluebird catch
. Finora, questo sta fallendo miseramente.
Perché la sottoclasse non mostra un messaggio o traccia dello stack?
Modifica:using Chrome's built-in subclassing (grazie a @coder) funziona perfettamente. Questo non è specifico per Babel, necessariamente, come nel seguente esempio (da @loganfsmyth on Babel's gitter feed) mostra:
// Works
new (function(){
"use strict";
return class E extends Error { }
}());
// Doesn't
new (function(){
"use strict";
function E(message){
Error.call(this, message);
};
E.prototype = Object.create(Error);
E.prototype.constructor = E;
return E;
}());
Non penso che sia un problema di Babele. Se utilizzi il vecchio modo di estendere l'errore, ottieni lo stesso stack mancante (su Chromium41). –
puoi confermare il browser che stai utilizzando? sembra funzionare per chrome v42 https://jsfiddle.net/5e3kakqj/ – coder
@coder su Chrome 42 pure. Il tuo esempio funziona, ma la versione Babel no. – ssube