Uruchamiając ten fragment poprzez BabelJS:Rozszerzone Błędy nie masz wiadomość lub ślad stosu
class FooError extends Error {
constructor(message) {
super(message);
}
}
let error = new FooError('foo');
console.log(error, error.message, error.stack);
wyprowadza
{}
który nie jest to, czego oczekują. Uruchamianie
error = new Error('foo');
console.log(error, error.message, error.stack);
produkuje
{} 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)
który jest dokładnie to, co chciałbym z rozszerzonego błędu.
Moim celem jest rozszerzenie Error
na różne podklasy i użycie ich w dopasowaniu bluebirda do catch
. Jak na razie, to niestety się nie udaje.
Dlaczego podklasa nie pokazuje komunikatu lub śladu stosu?
Edytuj:using Chrome's built-in subclassing (dzięki @coder) działa idealnie. To nie jest specyficzna dla Babel, koniecznie, jak w poniższym przykładzie (od @loganfsmyth on Babel's gitter feed) pokazuje:
// 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;
}());
Nie sądzę, że to problem Babel. Jeśli użyjesz starego sposobu, aby przedłużyć błąd, otrzymasz ten sam brakujący stos (na Chromium41). –
Czy możesz potwierdzić, z której przeglądarki korzystasz? Wydaje się, że działa także dla Chrome v42 https://jsfiddle.net/5e3kakqj/ – coder
@coder na Chrome 42. Twój przykład działa, ale wersja Babel tego nie robi. – ssube