2017-08-07 4 views
3

エラーオブジェクトをインスタンス化するたびに.stackフィールドがあります。スタックトレースを構築することはコストのかかる操作であると仮定すると、私の自然な反応は、例外的な場合にその使用を予約することです。エラーオブジェクトのスタックはいつ生成されますか?

しかし、私はv8でstacktraceが.stackフィールドの読み取り時にのみ計算されていることを覚えています。

new Error(...)は、スタックを一度も読み取らないとnew Object(...)と同じくらい高価だと思いますか?

これはJSエンジンの機能ですか、標準的な動作ですか?

+0

エラーをログに記録できませんか? –

+0

スタックトレースの収集は、まだフォーマットされておらず、まだストリングとして保存されていても、コストがかかる操作です。 – Bergi

答えて

3

Error.prototype.stackは非標準機能なので、その動作は実装によって異なります。 V8ベースのプラットフォームの場合は

は、GitHubの上 wikiは言う:エラーが作成されたとき

スタックトレースが収集され、関係なく、同じ ですか何回エラースローされます。

とのNode.jsのdocumentも同じことを言う:

Errorオブジェクトは、エラーがインスタンス化されたときのコード でポイントを詳述し、「スタックトレース」をキャプチャし、提供することができテキスト エラーの説明。

だから、Errorオブジェクトが作成されたときにを収集し、既にあります。

しかし、それは同じwikiページ状態の段落として、stackプロパティがアクセスされた最初の時間までをフォーマットしではありません。彼らは を撮影しているとき、効率のスタックトレースについては

がフォーマットされていませんスタックプロパティにアクセスするのは初めてです。

関連する問題