この質問は、es6 extendを扱うExtended Errors do not have message or stack traceと同じではありませんが、私はes5を使用しています。拡張エラーが間違ったスタックトレース情報を返します
ここに私のコードは
test.js
function FooError(message) {
this.stack = (new Error(message)).stack;
console.log('this.stack', this.stack);
console.log('new_error_stack', (new Error(message)).stack);
console.log('after');
}
FooError.prototype = new Error;
throw new FooError("foo");
だ。これは、次のように出力できます:ノードのバージョン6.4(node test.js
')this.stack'、あなたが見ることができるように
this.stack Error
at Object.<anonymous> (/tmp/test.js:7:22)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:509:3
new_error_stack Error: foo
at Error.FooError (/tmp/test.js:4:33)
at Object.<anonymous> (/tmp/test.js:9:7)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
after
/tmp/test.js:9
throw new FooError("foo");
^
Error
at Object.<anonymous> (/tmp/test.js:7:22)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:509:3
とし'new_error_stack'よりも全く同じことを表示しません。たとえば、this.stackは、requireが呼び出されたときにエラーがスローされたかのようにスタックを表示します。また、投げられたスタックも「間違っている」。
https://stackoverflow.com/a/5251506/1993501からコードを取得しました。instanceof FooError
を使用したいので、という行を使用します。
ご覧のとおり、 'new_error_stack'は期待される出力を示しますが、両方の値が等しいと予想されます。 https://github.com/open-xml-templating/docxtemplater/issues/245
正確に何が起こっている、と私は適切なエラーの種類を、それを防止しておくことができる方法(例えばにできること:
これはエラーが私のライブラリのユーザーのために非常に有用ではない効果があり、対応する問題を参照してくださいinstanceofを使用しますか?
これらの行のErrorオブジェクト宣言を囲む括弧を使用しない理由はありますか? 'new Error(message).stack'?それはこのようなものではないと奇妙に思います: '(このエラー(メッセージ))。stack'は、[this link](http://stackoverflow.com/questions/1382107/whats-a-good-あなたが与えたjavascript/5251506#5251506)を使用してください。 – Xetnus
これは意図的なものではありませんでしたが、影響がないようですが、どちらの構文も同等であると思います。コードは変わらないように投稿を編集しました。 – edi9999