【PHP8.x】UnexpectedValueException::getMessage()メソッドの使い方
getMessageメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getMessageメソッドは、スローされたUnexpectedValueExceptionオブジェクトから、例外メッセージの文字列を取得するメソッドです。UnexpectedValueExceptionは、値が期待される型や形式の集合と一致しない場合に発生する例外です。例えば、関数がある特定のパターンの文字列を期待しているにもかかわらず、全く異なるパターンの文字列が渡された場合などに使用されます。例外が生成される際、通常はその原因を説明するための具体的なメッセージが設定されます。getMessageメソッドを呼び出すことで、この設定されたメッセージ文字列を取り出すことができます。この機能は、プログラムのデバッグやエラー処理において非常に重要な役割を果たします。具体的には、try...catch構文でUnexpectedValueExceptionを捕捉した際に、このメソッドを使ってエラーメッセージを取得し、ログファイルに記録したり、開発者向けにエラー内容を表示したりすることで、問題の原因を迅速に特定するのに役立ちます。このメソッドはPHPの全ての例外の基底クラスであるExceptionクラスで定義されており、UnexpectedValueExceptionはそれを継承しているため利用可能です。
構文(syntax)
1<?php 2 3try { 4 // 予期しない値を持つ例外を意図的に発生させます。 5 throw new UnexpectedValueException("処理の途中で予期しない値が見つかりました。"); 6} catch (UnexpectedValueException $e) { 7 // 捕捉した例外オブジェクトからメッセージを取得して表示します。 8 echo $e->getMessage(); 9} 10 11?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
例外発生時のエラーメッセージを文字列として返します。
サンプルコード
PHP UnexpectedValueException getMessage を使う
1<?php 2 3/** 4 * ユーザーの年齢を検証し、不正な値の場合は例外をスローする関数 5 * 6 * @param mixed $age 検証する年齢 7 * @return void 8 * @throws UnexpectedValueException 年齢が0以上の整数でない場合 9 */ 10function validateUserAge(mixed $age): void 11{ 12 // is_int()で整数かどうか、そして0未満でないかを確認します 13 if (!is_int($age) || $age < 0) { 14 // 条件に合わない場合、エラーメッセージを付けてUnexpectedValueExceptionをスローします 15 throw new UnexpectedValueException('年齢は0以上の整数でなければなりません。'); 16 } 17 18 echo "年齢 {$age} は有効です。" . PHP_EOL; 19} 20 21try { 22 // 正常な値を渡して関数を呼び出します 23 validateUserAge(30); 24 25 // 不正な値(期待しない値)を渡して関数を呼び出します 26 validateUserAge(-5); 27 28} catch (UnexpectedValueException $e) { 29 // throwされた例外をcatchブロックで捕捉します 30 // getMessage()メソッドで、例外オブジェクトに設定されたエラーメッセージを取得し表示します 31 echo 'エラーが発生しました: ' . $e->getMessage() . PHP_EOL; 32} 33 34?>
UnexpectedValueExceptionクラスのgetMessageメソッドは、発生した例外オブジェクトに設定されているエラーメッセージを取得するために使用します。
サンプルコードのvalidateUserAge関数は、引数で受け取った年齢$ageが0以上の整数であるかを確認します。もし条件を満たさない場合、throw new UnexpectedValueException(...)によって、具体的なエラーメッセージを持った例外を発生させます。UnexpectedValueExceptionは、変数の値が期待したものではなかった場合に使われる例外です。
try...catchブロックは、このような例外が発生する可能性のある処理を安全に実行するための構文です。validateUserAge(-5)が呼び出されると例外がスローされ、処理はcatchブロックへと移ります。catchブロックでは、発生した例外オブジェクトが変数$eに代入されます。
ここで$e->getMessage()を呼び出すと、例外が作られた際に設定されたエラーメッセージ「年齢は0以上の整数でなければなりません。」が文字列として取得できます。このメソッドは引数を必要とせず、戻り値としてエラーメッセージの文字列(string型)を返します。この機能により、エラーが発生した際にその原因を具体的に知ることができます。
getMessage()メソッドは、例外が作られる際に設定されたエラーメッセージ文字列を取得します。このサンプルコードでは、throw new UnexpectedValueException('...')の部分でメッセージが設定されています。注意点として、throwされた例外はcatchブロックで捕捉しないと、プログラムがエラーで停止してしまいます。例外が発生しうる処理は、必ずtryブロックで囲むようにしてください。また、catchでは捕捉する例外の型を指定します。UnexpectedValueExceptionのように具体的な型を指定することで、エラーの種類に応じた適切な対応が可能になります。デバッグやログ記録のために、例外をthrowする際は、エラーの原因が明確にわかるメッセージを設定することが非常に重要です。
PHP UnexpectedValueExceptionメッセージを切り詰める
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 長い例外メッセージを短縮して表示するサンプル 7 * 8 * この関数は、意図的に長いメッセージを持つ UnexpectedValueException を発生させ、 9 * catch ブロックでそのメッセージを getMessage() を使って取得します。 10 * その後、ログ記録やUI表示を想定し、メッセージが長すぎる場合に 11 * 一定の文字数に切り詰める (truncate) 方法を示します。 12 */ 13function demonstrateTruncatedMessage(): void 14{ 15 try { 16 // 意図的に非常に長い例外メッセージを生成してスローする 17 $longErrorMessage = 'A critical error occurred during data processing. The input value, which was expected to be a positive integer, was a long string containing non-numeric characters. This violates the data integrity constraints defined in the system specification document, section 4, paragraph 2.'; 18 throw new UnexpectedValueException($longErrorMessage); 19 } catch (UnexpectedValueException $e) { 20 // Exception::getMessage() を使って、例外オブジェクトから元のメッセージを取得します。 21 $originalMessage = $e->getMessage(); 22 23 // ログやUI表示用に、メッセージを50文字に切り詰めます (truncated)。 24 // mb_strimwidth を使うことで、マルチバイト文字も安全に扱えます。 25 $truncatedMessage = mb_strimwidth($originalMessage, 0, 50, '...'); 26 27 echo "--- Original Message ---\n"; 28 echo $originalMessage . "\n\n"; 29 30 echo "--- Truncated Message for Log/UI ---\n"; 31 echo $truncatedMessage . "\n"; 32 } 33} 34 35// 関数を実行して結果を表示 36demonstrateTruncatedMessage();
このPHPサンプルコードは、例外オブジェクトからエラーメッセージを取得するgetMessage()メソッドの使用法を示しています。
コードでは、まずtryブロック内で、意図的に長いエラーメッセージを持つUnexpectedValueExceptionをthrowキーワードを使って発生させています。UnexpectedValueExceptionは、関数の引数などが期待していた値と異なるときに使われる例外の一種です。
次にcatchブロックで、発生した例外を$eという変数で受け取ります。$e->getMessage()を呼び出すことで、例外が作られた際に設定されたメッセージ文字列を取得できます。このメソッドに引数は必要ありません。戻り値は、throwされた例外オブジェクトが保持しているメッセージ(string型)です。
このサンプルでは、取得した元のメッセージが長すぎる場合を想定し、ログ出力や画面表示のために内容を短縮(truncate)する実践的な例も示しています。mb_strimwidth()関数を使ってメッセージを指定した文字数に切り詰め、末尾に「...」を付加しています。このようにgetMessage()で得た情報を加工することで、システム運用時の可読性を高めることができます。
getMessage()は、例外発生時に設定されたエラーメッセージを文字列としてそのまま取得するメソッドです。このメソッド自体にメッセージを短縮する機能はありません。サンプルコードのように、ログには元の詳細なメッセージを記録し、ユーザー向けの画面には内容を要約したり、mb_strimwidth関数で短く切り詰めたメッセージを表示したりする使い分けが重要です。特に日本語などマルチバイト文字を扱う場合、substrではなくmb_で始まる関数を使わないと文字化けの原因となるため注意が必要です。これにより、システムの内部情報を不必要に漏らすことなく、分かりやすいエラー表示を実現できます。