當通過BabelJS運行這段代碼:擴展錯誤沒有消息或堆棧跟蹤
class FooError extends Error {
constructor(message) {
super(message);
}
}
let error = new FooError('foo');
console.log(error, error.message, error.stack);
它輸出
{}
這不是我所期望的。運行
error = new Error('foo');
console.log(error, error.message, error.stack);
產生
{} 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)
這正是我想從擴展的錯誤一樣。
我的目標是將Error
擴展成各種子類,並將它們用於藍鳥的catch
匹配。到目前爲止,這是失敗的悲慘。
爲什麼子類不顯示消息或堆棧跟蹤?
編輯:using Chrome's built-in subclassing(感謝@coder)完美地工作。這是不特定於通天,不一定,如下面的示例(來自@loganfsmyth on Babel's gitter feed)表示:
// 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;
}());
我不認爲這是一個巴別塔問題。如果您使用舊的方式來擴展錯誤,您將得到相同的缺失堆棧(在Chromium41上)。 –
你能確認你使用的瀏覽器嗎? Chrome 42上的chrome v42 https://jsfiddle.net/5e3kakqj/ – coder
@coder也是如此。你的例子有效,但Babel版本沒有。 – ssube