2016-08-27 10 views
0

この質問は、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を使用しますか?

+0

これらの行のErrorオブジェクト宣言を囲む括弧を使用しない理由はありますか? 'new Error(message).stack'?それはこのようなものではないと奇妙に思います: '(このエラー(メッセージ))。stack'は、[this link](http://stackoverflow.com/questions/1382107/whats-a-good-あなたが与えたjavascript/5251506#5251506)を使用してください。 – Xetnus

+0

これは意図的なものではありませんでしたが、影響がないようですが、どちらの構文も同等であると思います。コードは変わらないように投稿を編集しました。 – edi9999

答えて

1

私はあなたの問題の解決策を見つけましたが、あなたの問題をすべて解決しているかどうかは完全にはわかりません。私はnew Errorの代わりにError.prototypeを使用しています(あなたが持っていたものです)。私も、私はテスト目的のために出力を表示するにはalert()を使用していたとして、2つの文字列を連結するには、あなたのconsole.logラインを変更しHow do I create a custom Error in JavaScript?

:私はこの質問に設けられた第一の回答から、この解決策を見つけました。

ケヴィン・ハカンソンは、なぜあなたはこの解決策を自分の答えに含めるかしたくないのかと考えています。

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 = Error.prototype; 

throw new FooError("foo"); 

最後の行でtry/catchブロックを使用したい場合があります。

+0

これはうまくいくようです。ありがとうございます。あなたはそれがなぜ異なって動作するのか考えていますか? – edi9999

+0

私は言うことはできません。違った動作をするのはかなり奇妙です。しかし、 'Error.prototype'を使って問題に遭遇した場合、私があなたに与えたそのリンクの2番目の答えをチェックしてください。 – Xetnus

関連する問題