【PHP8.x】getTraceメソッドの使い方

getTraceメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

getTraceメソッドは、PHP 8で導入されたUnhandledMatchErrorクラスに属し、エラー発生時のプログラムの実行履歴(スタックトレース)を取得するメソッドです。UnhandledMatchErrorは、match式を使用する際に、どのcaseパターンにも一致せず、かつデフォルトの_(アンダースコア)パターンも定義されていない場合に発生する、非常に具体的なエラータイプです。

このgetTraceメソッドを呼び出すことで、UnhandledMatchErrorが発生した時点における、関数やメソッドの呼び出し順序、ファイル名、行番号、クラス名といった詳細な情報を配列として取得できます。取得されるスタックトレースの情報は、プログラムがどのような経路をたどってエラー箇所に到達したのかを明確に示します。

システムエンジニアを目指す初心者の方にとって、エラー発生時に問題の根本原因を特定し、デバッグを行う上で、このgetTraceメソッドが提供する情報は非常に重要です。特にUnhandledMatchErrorのような特定の条件下で発生するエラーの解析において、その発生源を迅速に特定し、効率的な修正作業に役立てることができます。これにより、match式の予期せぬ挙動を解析し、より堅牢で信頼性の高いコードを記述するための手がかりを得られます。

構文(syntax)

1<?php
2$trace = $unhandledMatchError->getTrace();

引数(parameters)

引数なし

引数はありません

戻り値(return)

array

このメソッドは、例外が発生した際のエラー発生箇所までの呼び出し履歴を配列形式で返します。

サンプルコード

PHP UnhandledMatchError のトレースを取得する

1<?php
2
3/**
4 * この関数は、意図的に UnhandledMatchError を発生させます。
5 * match 式がすべての可能性を網羅していない場合に発生するエラーです。
6 *
7 * @param int $value 判定する値
8 */
9function triggerUnhandledMatchError(int $value): void
10{
11    // match 式は PHP 8 以降で導入されました。
12    // $value が 1 または 2 の場合は処理されますが、
13    // 他の値(例: 3)の場合は UnhandledMatchError が発生します。
14    match ($value) {
15        1 => print "値は1です。\n",
16        2 => print "値は2です。\n",
17        // デフォルトケース (_ => ...) がないため、他の値でエラーが発生します。
18    };
19}
20
21// UnhandledMatchError を捕捉するために try-catch ブロックを使用します。
22try {
23    // 意図的に UnhandledMatchError が発生するような値を渡します。
24    triggerUnhandledMatchError(3);
25} catch (UnhandledMatchError $e) {
26    // エラーが捕捉されたことを表示します。
27    echo "UnhandledMatchError が捕捉されました!\n\n";
28
29    // --- getTrace() の使用例 ---
30    // getTrace() メソッドは、エラーが発生した時点のスタックトレースを
31    // 配列(array)形式で返します。
32    // 各要素は、呼び出し元ファイル、行番号、関数名などの情報を持つ配列です。
33    echo "--- getTrace() で取得したスタックトレース (配列形式) ---\n";
34    print_r($e->getTrace());
35    echo "\n";
36
37    // --- getTraceAsString() の使用例 ---
38    // キーワードに関連する getTraceAsString() メソッドも紹介します。
39    // このメソッドは、スタックトレースを人間が読みやすい文字列形式で返します。
40    // getTrace() で得られる情報を整形して表示する際に便利です。
41    echo "--- getTraceAsString() で取得したスタックトレース (文字列形式) ---\n";
42    echo $e->getTraceAsString();
43}
44
45?>

このPHPコードは、PHP 8で導入されたUnhandledMatchErrorというエラーの捕捉と、そのエラー情報を取得する方法を示しています。UnhandledMatchErrorは、match式が評価するすべてのケースを網羅していない場合に発生するエラーです。

サンプルコードでは、triggerUnhandledMatchError関数で意図的にこのエラーを発生させ、try-catchブロックでUnhandledMatchErrorを捕捉しています。エラーが捕捉された後、$eというエラーオブジェクトから呼び出せるgetTrace()メソッドについて解説します。

getTrace()メソッドは引数を取らず、エラーが発生した時点の関数の呼び出し履歴、つまり「スタックトレース」を配列(array)形式で返します。この配列には、エラーが発生するまでの各ステップにおけるファイル名、行番号、関数名などの詳細な情報が含まれており、エラーの原因を特定する際に非常に役立ちます。

また、関連するgetTraceAsString()メソッドも紹介しています。このメソッドもスタックトレースを返しますが、getTrace()がプログラムで処理しやすい配列形式であるのに対し、getTraceAsString()は人間が読みやすい整形された文字列形式で返します。デバッグ時にスタックトレースを直接表示する際に便利です。

このサンプルコードは、PHP 8で導入されたmatch式が網羅的でない場合に発生するUnhandledMatchErrorの扱い方を説明しています。開発時には、match式に必ずデフォルトケース(_ => ...)を追加し、予期せぬエラーを防ぐよう注意してください。

getTrace()メソッドは、エラー発生時の詳細な呼び出し履歴を配列として取得し、プログラムによる解析やログ記録に役立ちます。一方、キーワードにもあるgetTraceAsString()メソッドは、その履歴を人間が読みやすい文字列形式で出力するため、デバッグ時の画面表示などに便利です。本番環境では、try-catchでエラーを適切に捕捉し、スタックトレース情報をログに記録するなど、ユーザーへの影響を最小限にする運用が重要です。

【PHP8.x】getTraceメソッドの使い方 | いっしー@Webエンジニア