【PHP8.x】JsonException::getMessage()メソッドの使い方
getMessageメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getMessageメソッドは、JsonExceptionオブジェクトから、例外に関する詳細なエラーメッセージを文字列として取得するメソッドです。このメソッドは、PHPの基本的な例外クラスであるExceptionクラスから継承された標準的な機能です。JsonExceptionは、json_encode()やjson_decode()といった関数でJSONデータの処理中にエラーが発生した際にスローされます。例えば、JSONの書式が正しくない場合や、不正な文字エンコーディングが含まれている場合などが該当します。プログラム実行中にこのような問題が起きると、エラーの原因を示すメッセージを持ったJsonExceptionオブジェクトが生成されます。getMessageメソッドを使うことで、このオブジェクトに格納されている具体的なエラー内容を人間が読める形式の文字列として取り出すことができます。通常はtry...catch構文と組み合わせて使用され、catchブロック内で捕捉した例外オブジェクトに対してこのメソッドを呼び出します。取得したエラーメッセージは、開発者がデバッグを行う際に画面へ表示したり、エラーログとしてファイルに記録したりするために利用され、問題解決に役立ちます。
構文(syntax)
1try { 2 json_decode('{', flags: JSON_THROW_ON_ERROR); 3} catch (JsonException $e) { 4 // 例外メッセージを取得します。 5 $errorMessage = $e->getMessage(); 6 echo $errorMessage; // 出力例: Syntax error 7}
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
このメソッドは、JSONデコードまたはエンコード時のエラーメッセージを文字列として返します。
サンプルコード
PHP JsonException getMessage でエラーメッセージを取得する
1<?php 2 3/** 4 * 不正なJSON文字列をデコードし、JsonExceptionからエラーメッセージを取得する関数 5 * 6 * この関数は、意図的に不正な形式のJSON文字列をデコードしようとします。 7 * json_decode()が失敗するとJsonExceptionがスローされるため、 8 * try-catchブロックでそれを捕捉します。 9 * catchブロック内では、JsonExceptionオブジェクトのgetMessage()メソッドを呼び出し、 10 * 具体的なエラー内容を取得して表示します。 11 */ 12function getJsonDecodeErrorMessage(): void 13{ 14 // プロパティ間にカンマが欠けている、不正な形式のJSON文字列 15 $invalidJsonString = '{"name": "Taro", "age" 30}'; 16 17 echo "以下の不正なJSONをデコードします..." . PHP_EOL; 18 echo $invalidJsonString . PHP_EOL . PHP_EOL; 19 20 try { 21 // json_decode() は、不正なJSONをパースしようとすると JsonException をスローします。 22 // (PHP 8.0以降、JSON_THROW_ON_ERRORがデフォルトの動作です) 23 json_decode($invalidJsonString, true, 512, JSON_THROW_ON_ERROR); 24 } catch (JsonException $e) { 25 // 捕捉した例外オブジェクト($e)から、getMessage()メソッドでエラーメッセージを取得します。 26 // これにより、なぜJSONのパースに失敗したのかという具体的な理由がわかります。 27 $errorMessage = $e->getMessage(); 28 29 echo "JSONのデコードに失敗しました。" . PHP_EOL; 30 echo "エラーメッセージ: " . $errorMessage . PHP_EOL; 31 } 32} 33 34// 関数を実行してエラーメッセージの取得を試みます。 35getJsonDecodeErrorMessage();
このPHPサンプルコードは、JsonExceptionクラスのgetMessage()メソッドを使用して、JSONのデコード時に発生したエラーの詳細を取得する方法を示しています。
getMessage()は、JSON処理でエラーが発生した際に、その原因を説明する具体的なメッセージを文字列として取得するためのメソッドです。このメソッドは引数を取らず、エラー内容を表す文字列を戻り値として返します。
サンプルコードでは、まずカンマが欠落した不正な形式のJSON文字列を用意しています。次に、tryブロック内でjson_decode()関数を実行し、この不正なJSON文字列をデコードしようと試みます。PHP 8以降、json_decode()はデコードに失敗するとJsonExceptionという例外を発生させます。
この発生した例外はcatchブロックで捕捉されます。catchブロック内では、捕捉したJsonExceptionオブジェクト(変数 $e)に対して$e->getMessage()を呼び出しています。これにより、「Syntax error」といった具体的なエラーメッセージが取得され、画面に出力されます。このようにgetMessage()を利用することで、JSON処理のエラー原因を正確に特定でき、プログラムの問題解決に役立ちます。
json_decode()で外部データなどを扱う際は、データが不正な形式である可能性を考慮し、必ずtry-catch構文で処理を囲むことが重要です。これにより、エラーが発生してもプログラムが突然停止するのを防げます。catchブロックでは、JSONのエラー専用であるJsonExceptionクラスを指定して捕捉します。捕捉した例外オブジェクトのgetMessage()メソッドを呼び出すと、「構文エラー」のような具体的な失敗理由を文字列として取得でき、デバッグに役立ちます。PHP 8.0以降、この例外を投げる挙動が標準となったため、より安全なエラー処理が簡単に行えるようになりました。getMessage()が返す内容は開発者向けのため、利用者にエラーを伝える際は、より分かりやすいメッセージに変換すると親切です。
PHPでカスタム例外のgetMessageをオーバーライドする
1<?php 2 3/** 4 * Exceptionクラスを継承したカスタム例外クラス 5 * 6 * API通信などで発生した独自のエラーを表現するために使用します。 7 * エラーコードを保持し、getMessage()で整形されたメッセージを返します。 8 */ 9class CustomApiException extends Exception 10{ 11 /** 12 * カスタムエラーコード 13 * @var int 14 */ 15 protected int $customErrorCode; 16 17 /** 18 * コンストラクタ 19 * 20 * @param string $message 例外メッセージ 21 * @param int $customErrorCode カスタムエラーコード 22 * @param int $code 例外コード 23 * @param Throwable|null $previous 以前の例外 24 */ 25 public function __construct(string $message = "", int $customErrorCode = 0, int $code = 0, ?Throwable $previous = null) 26 { 27 // 親クラスのコンストラクタを呼び出す 28 parent::__construct($message, $code, $previous); 29 $this->customErrorCode = $customErrorCode; 30 } 31 32 /** 33 * 例外メッセージをオーバーライド 34 * 35 * 親クラスのメッセージにカスタムエラーコードを付加した文字列を返します。 36 * これにより、例外発生時に追加情報を含んだ、より分かりやすいメッセージを取得できます。 37 * 38 * @return string 整形された例外メッセージ 39 */ 40 public function getMessage(): string 41 { 42 return "[API Error Code: {$this->customErrorCode}] " . parent::getMessage(); 43 } 44} 45 46// カスタム例外をスローし、キャッチする例 47try { 48 // 何らかの処理でエラーが発生したと仮定 49 throw new CustomApiException("ユーザー情報の取得に失敗しました。", 404); 50} catch (CustomApiException $e) { 51 // オーバーライドされたgetMessage()メソッドを呼び出す 52 echo $e->getMessage(); 53 // 出力結果: [API Error Code: 404] ユーザー情報の取得に失敗しました。 54} 55
このPHPサンプルコードは、PHPの基本的な例外クラスであるExceptionを継承し、独自の例外クラスCustomApiExceptionを作成する例です。特に、エラーメッセージを取得するgetMessage()メソッドの動作をカスタマイズする方法を示しています。
CustomApiExceptionクラスでは、独自のエラーコードを保持するためのプロパティが追加されています。そして、このコードの中心となるのがgetMessage()メソッドの「オーバーライド」です。getMessage()は引数を取らず、例外に関するメッセージを文字列(string)として返すメソッドです。
このサンプルでは、親クラスであるExceptionが元々持っているメッセージに、独自に保持しているAPIエラーコードを追加して、より詳細な情報を含んだ新しいメッセージ文字列を生成するように処理を上書きしています。
最後のtry-catch構文では、実際にCustomApiExceptionを発生させ、その例外オブジェクトからgetMessage()を呼び出しています。その結果、オーバーライドによって整形された「[API Error Code: 404] ユーザー情報の取得に失敗しました。」という、原因がより分かりやすいメッセージが出力されます。このようにgetMessage()をオーバーライドすることで、アプリケーションで発生したエラーの詳細を効率的に把握できるようになります。
このコードは、既存のExceptionクラスを継承し、getMessageメソッドの機能を上書き(オーバーライド)して独自の例外クラスを作成する例です。注意点として、オーバーライドしたgetMessageメソッド内でparent::getMessage()を呼び出すことで、親クラスが持つ元のメッセージを再利用しています。これを忘れると、意図したメッセージが表示されないため重要です。また、コンストラクタでparent::__construct()を呼び出し、親クラスの初期化を確実に行う必要もあります。メソッドを上書きする際は、引数や戻り値の型を親クラスと一致させることが、型の厳密なPHP 8以降では特に求められます。このように独自の例外クラスを定義すると、エラーの種類を細かく管理でき、デバッグ時に役立つ詳細な情報をメッセージに含めることが可能になります。