JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptでスタックトレースを取得する方法【例外発生時のデバッグ術】

JavaScriptの開発では、エラーの原因を特定するためにスタックトレース(呼び出し履歴)を確認することが非常に重要です。例外がスローされた箇所だけでなく、そこに至るまでの関数の呼び出し経路を把握できれば、バグの特定は格段に早くなります。

Errorオブジェクトのstackプロパティを使う

JavaScriptでスタックトレースを取得する最もシンプルな方法は、new Error() でエラーオブジェクトを生成し、その stack プロパティを参照することです。コードにわずか数行追加するだけで、現在時点の呼び出し履歴を文字列として取得できます。

サンプルコード

<html>
   <head>
      <script>
         // スタックトレースを取得する関数
         function stackTrace() {
            var err = new Error();
            return err.stack;
         }

         // コンソールと画面に出力
         console.log(stackTrace());
         document.write(stackTrace());
      </script>
   </head>
   <body>
      <p>上記にスタックトレースが出力されます。</p>
   </body>
</html>

実行結果

JavaScriptでスタックトレースを取得する方法【例外発生時のデバッグ術】

このコードを実行すると、stackTrace() 関数が呼ばれた位置から、new Error() が生成された行までの呼び出し履歴が表示されます。ブラウザの開発者ツール(コンソール)でも同じ内容を確認できます。

try〜catch文で例外発生時のスタックトレースを取得する

実際のデバッグでは、例外がスローされた瞬間のスタックトレースを取得したいケースがほとんどです。try〜catch 文と組み合わせれば、キャッチしたエラーオブジェクトから直接スタックトレースを取り出せます。

try {
   throw new Error('テスト用の例外');
} catch (e) {
   console.error(e.stack); // 例外発生時のスタックトレースを出力
}

console.error() を使うことで、コンソール上でエラーとして強調表示されるため、問題の切り分けがさらに容易になります。

まとめ

  • new Error().stack を参照すれば、任意の場所でスタックトレースを取得できる。
  • 例外処理では catch (e)e.stack を出力するのが定石。
  • 開発者ツールのコンソールと併用すると、デバッグ効率が大きく向上する。

スタックトレースはエラー発生箇所の特定だけでなく、意図しない呼び出し経路の発見にも役立ちます。日頃の開発にぜひ取り入れてみてください。

  1. JavaScriptでセレクトボックスの選択に応じて非表示のdivを表示・切り替える方法

    Webフォームを作成していると、セレクトボックス(select要素)で特定のオプションが選ばれたときだけ、隠しておいたdiv要素を表示したいという場面によく出くわします。このような動的な表示切り替えは、JavaScriptの「style.display」プロパティを操作することで簡単に実現できます。表示したいタイミングで値を「block」に設定し、非表示にしたいときは「none」に戻すだけでOKです。実装例以下に、セレクトボックスで2番目のオプション(Javascript)が選択されたときに、非表示のdivを表示するサンプルコードを紹介します。<!DOCTYPE html> <

  2. JavaScriptでh1のinnerTextを取得する方法|子要素のテキストを除外する

    h1タグ内に子要素(spanなど)が含まれている場合、単純にinnerTextを取得すると子要素のテキストまで一緒に取られてしまいます。h1直下のテキストのみを取得したい場合は、childNodesとtextContentを組み合わせることで実現できます。 childNodes[0].textContent; 仕組みの解説 querySelector()で取得したh1要素に対してchildNodesを使うと、その子ノードの一覧(NodeList)が返されます。[0]で最初の子ノード、つまりh1直下のテキストノードにアクセスし、そこからtextContentを取得することで、子要素内のテキストを