Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】ErrorException::getMessage()メソッドの使い方

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

作成日: 更新日:

基本的な使い方

getMessageメソッドは、ErrorExceptionオブジェクトに格納されているエラーメッセージを取得するメソッドです。ErrorExceptionは、PHPが通常発生させるエラー(例えば、存在しないファイルを開こうとした場合など)を、開発者が通常の例外処理(try-catch文など)で捕捉できるように、Exceptionクラスのインスタンスとしてラップするために使用される特別なクラスです。このメソッドを利用することで、プログラムの実行中に発生した特定のエラーについて、具体的にどのような問題が発生したのかを詳細な文字列として取得できます。

例えば、エラーが発生した際にその原因をログに記録したり、ユーザーに対して分かりやすいメッセージを表示したりする際に、getMessageメソッドが返すエラーメッセージが非常に役立ちます。このメソッドは引数を取らずに呼び出すことができ、常にエラー内容を表す文字列を返します。返される文字列は、ErrorExceptionオブジェクトが生成される際にコンストラクタで指定されたものです。システムエンジニアを目指す上で、プログラムの堅牢性を高めるためのエラーハンドリングは非常に重要であり、getMessageメソッドはその中心的な役割を担う基本的なツールの一つと言えるでしょう。

構文(syntax)

1<?php
2try {
3    // ErrorException のインスタンスを生成し、スローする例
4    throw new ErrorException("指定されたファイルが見つかりません。", 0, E_ERROR, __FILE__, __LINE__);
5} catch (ErrorException $e) {
6    // ErrorException::getMessage() を呼び出してエラーメッセージを取得する
7    echo $e->getMessage();
8}

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

このメソッドは、発生した例外のエラーメッセージを文字列として返します。

サンプルコード

ErrorException::getMessageでエラーメッセージを取得する

1<?php
2
3/**
4 * ErrorException::getMessage() の使用法を示すクラス。
5 *
6 * PHPの従来のエラー(Notice、Warningなど)をErrorExceptionに変換し、
7 * catchブロックで getMessage() を使ってエラーメッセージを取得します。
8 * キーワード「truncated」に関連し、長いエラーメッセージが
9 * getMessage()自体によって切り捨てられないことを示します。
10 */
11class ErrorMessageExample
12{
13    /**
14     * サンプルコードを実行します。
15     */
16    public function run(): void
17    {
18        // set_error_handlerを使い、PHPの従来のエラーを例外として捕捉する準備をします。
19        // この関数がエラーハンドラとして登録されます。
20        set_error_handler([$this, 'handleErrorAsException']);
21
22        try {
23            // 意図的に長いメッセージを持つNoticeエラーを発生させます。
24            // 未定義の変数にアクセスすると、設定したエラーハンドラが呼び出されます。
25            $a_very_long_variable_name_that_might_seem_to_be_truncated_in_some_environments++;
26        } catch (ErrorException $e) {
27            // スローされたErrorExceptionをキャッチします。
28            $fullMessage = $e->getMessage();
29
30            // getMessage()で取得した完全なエラーメッセージを出力します。
31            // このメソッド自体がメッセージを切り捨てる(truncate)ことはありません。
32            // 表示が途切れる場合、Xdebugの設定やコンソールの表示限界が原因の可能性があります。
33            echo "Caught full error message:\n";
34            echo $fullMessage . "\n\n";
35
36            // 参考:その他の情報も取得できます。
37            echo "File: " . $e->getFile() . "\n";
38            echo "Line: " . $e->getLine() . "\n";
39            echo "Severity: " . $e->getSeverity() . "\n";
40        } finally {
41            // スクリプトの他の部分に影響を与えないよう、エラーハンドラをデフォルトに戻します。
42            restore_error_handler();
43        }
44    }
45
46    /**
47     * PHPのエラーをErrorExceptionに変換してスローするエラーハンドラ。
48     *
49     * @param int    $severity エラーレベル
50     * @param string $message  エラーメッセージ
51     * @param string $file     エラーが発生したファイル名
52     * @param int    $line     エラーが発生した行番号
53     * @throws ErrorException 常にスローされます。
54     */
55    public function handleErrorAsException(int $severity, string $message, string $file, int $line): void
56    {
57        throw new ErrorException($message, 0, $severity, $file, $line);
58    }
59}
60
61// クラスのインスタンスを作成し、サンプルを実行します。
62$example = new ErrorMessageExample();
63$example->run();

ErrorException::getMessage()は、例外オブジェクトが保持するエラーメッセージを文字列として取得するためのメソッドです。このメソッドは引数を取らず、戻り値としてエラーの内容を表す文字列(string)を返します。

このサンプルコードでは、まずset_error_handler関数を使い、PHPの標準的なエラー(NoticeやWarningなど)をErrorExceptionという例外として扱えるように設定しています。次にtryブロックの中で、意図的に未定義の長い名前の変数へアクセスすることでエラーを発生させます。このエラーは設定したハンドラによってErrorExceptionとしてスローされ、続くcatchブロックで捕捉されます。

catchブロック内では、捕捉した例外オブジェクト(変数$e)に対して$e->getMessage()を呼び出し、エラーメッセージを取得して表示しています。このコードは、getMessage()メソッド自体が長いエラーメッセージを途中で切り捨てる(truncate)ことはない、という点を示しています。たとえエラーメッセージが非常に長くても、このメソッドは完全な文字列を返します。もしコンソールなどでメッセージの表示が途切れる場合は、PHPの設定(例: Xdebug)や実行環境の表示限界など、別の要因が考えられます。

ErrorExceptiongetMessage()メソッドは、エラーメッセージをそのまま返します。このメソッド自体がメッセージを短く切り捨てることはありません。もしメッセージが途切れて表示される場合は、Xdebugの表示文字数制限やターミナルの表示幅など、PHP外部の環境設定が原因である可能性が高いです。また、このコードのようにNoticeやWarningといった従来のエラーをtry...catchで捕捉するには、事前にset_error_handlerでエラーを例外に変換する設定が必須です。処理後は、他の部分への影響を避けるためrestore_error_handlerで設定を元に戻すことが推奨されます。

PHP Exception getMessage をオーバーライドする

1<?php
2
3declare(strict_types=1);
4
5/**
6 * 独自の例外クラスを定義します。
7 * PHPの組み込みExceptionクラスを継承します。
8 */
9class CustomApplicationException extends Exception
10{
11    /**
12     * getMessage() メソッドをオーバーライド(上書き)します。
13     * 親クラスのメッセージにエラーコードを付与した、より詳細なメッセージを返します。
14     *
15     * @return string 整形されたエラーメッセージ
16     */
17    public function getMessage(): string
18    {
19        // parent::getMessage() で元のメッセージを取得し、
20        // $this->getCode() でエラーコードを取得して、新しい文字列を生成します。
21        return sprintf(
22            "[アプリケーションエラー CODE: %d] %s",
23            $this->getCode(),
24            parent::getMessage()
25        );
26    }
27}
28
29try {
30    // 独自に定義した例外を意図的に発生させます(スローします)。
31    // 第1引数にメッセージ、第2引数にエラーコードを渡します。
32    throw new CustomApplicationException("設定ファイルの読み込みに失敗しました。", 5001);
33} catch (CustomApplicationException $e) {
34    // catchブロックで例外を捕捉し、オーバーライドされたgetMessage()メソッドを呼び出します。
35    echo $e->getMessage() . PHP_EOL;
36}

このPHPサンプルコードは、組み込みのExceptionクラスを継承してCustomApplicationExceptionという独自の例外クラスを定義し、エラーメッセージの形式をカスタマイズする方法を示しています。

中心となるのはgetMessage()メソッドのオーバーライド(上書き)です。getMessage()は、例外オブジェクトが持つエラーメッセージを文字列として返すためのメソッドで、引数はありません。このサンプルコードでは、CustomApplicationExceptionクラス内でgetMessage()を再定義しています。その内部では、parent::getMessage()を呼び出して親クラス(Exception)の元のエラーメッセージを取得し、さらに$this->getCode()で設定されたエラーコードを取得します。そして、これらを組み合わせて「[アプリケーションエラー CODE: {コード}] {元のメッセージ}」という、より詳細な情報を含む新しい文字列を生成して返します。

try-catchブロックでは、この独自に定義した例外をthrowキーワードで意図的に発生させています。catchブロックでこの例外を捕捉し、例外オブジェクトのgetMessage()メソッドを呼び出すと、標準のメッセージではなく、オーバーライドによって整形された詳細なメッセージが出力されます。このようにgetMessage()をオーバーライドすることで、ログ出力やエラー表示をアプリケーションの要件に合わせて分かりやすく制御できます。

Exceptionクラスを継承してgetMessage()メソッドをオーバーライド(上書き)すると、エラーメッセージの形式を自由にカスタマイズできます。オーバーライドする際は、親クラスのメソッド定義と戻り値の型(この場合はstring)を完全に一致させる必要があります。これを忘れるとエラーの原因となります。元のメッセージを活用するためにparent::getMessage()を呼び出すのが一般的です。これを使わないと、例外を生成した際に指定したメッセージが無視されてしまいます。サンプルコードのように、getCode()で取得したエラーコードをメッセージに含めると、エラーの原因調査がしやすくなります。この方法はログ出力には非常に有効ですが、ユーザーに表示するエラーメッセージには、システムの内部情報を含めすぎないよう注意が必要です。

PHP ErrorException getMessageでエラー内容を取得する

1<?php
2
3// PHPのエラーをErrorExceptionとして捕捉するためのカスタムエラーハンドラを設定します。
4// これにより、通常のPHPエラー(例: E_NOTICE, E_WARNING)もtry-catchブロックで処理できるようになります。
5set_error_handler(function (int $severity, string $message, string $file, int $line): bool {
6    // 現在のエラーレポート設定で無視されるエラーは、このハンドラでは変換しない
7    if (!(error_reporting() & $severity)) {
8        return false;
9    }
10    // エラーをErrorExceptionインスタンスとしてスローする
11    throw new ErrorException($message, 0, $severity, $file, $line);
12});
13
14try {
15    // ここで意図的にPHPのE_NOTICEレベルのエラーを発生させます。
16    // 未定義の変数にアクセスしようとすると、PHPはE_NOTICEエラーを生成します。
17    // このエラーは上記のカスタムエラーハンドラによってErrorExceptionに変換され、捕捉されます。
18    echo $undefinedVariable; // 例: 'Undefined variable $undefinedVariable' のNOTICEが発生
19} catch (ErrorException $e) {
20    // ErrorExceptionが捕捉された場合、getMessage()メソッドを使用して
21    // エラーの具体的な内容を文字列として取得し、表示します。
22    echo "捕捉されたエラーメッセージ: " . $e->getMessage() . PHP_EOL;
23
24    // 必要に応じて、エラーが発生したファイル名や行番号などの情報も取得可能です。
25    // echo "エラー発生ファイル: " . $e->getFile() . PHP_EOL;
26    // echo "エラー発生行: " . $e->getLine() . PHP_EOL;
27}
28
29// カスタムエラーハンドラを元のPHPデフォルトの状態に戻します。
30// スクリプトの最後で常に実行することが推奨されます。
31restore_error_handler();
32
33?>

PHPでプログラムを実行中に発生する様々な問題、特に通常のPHPエラー(例:未定義変数へのアクセス)を、例外(Exception)として扱い、統一的に処理するためのクラスがErrorExceptionです。このErrorExceptionクラスが持つgetMessageメソッドは、発生したエラーの具体的な内容を文字列として取得するために使用されます。

getMessageメソッドは引数を取りません。呼び出すだけで、エラーの際にPHPが生成した詳細なメッセージを、そのまま文字列型(string)として返します。これにより、プログラムのどこでどのような問題が発生したのかを把握し、デバッグやユーザーへの適切な情報提供に役立てることができます。

サンプルコードでは、まずset_error_handler関数を使って、PHPの通常のエラーをErrorExceptionに変換するカスタムエラーハンドラを設定しています。これにより、try-catchブロック内で通常のエラーも例外として捕捉できるようになります。tryブロック内で意図的に未定義の変数にアクセスすると、本来はPHPのNoticeエラーが発生しますが、カスタムハンドラによってErrorExceptionとしてスローされます。catch (ErrorException $e)ブロックでこのエラーを捕捉した後、$e->getMessage()を呼び出すことで、「Undefined variable $undefinedVariable」のような具体的なエラーメッセージを取得し、画面に表示しています。最終的にrestore_error_handlerで元のエラーハンドラに戻し、クリーンな状態にしています。getMessageは、エラーの内容をわかりやすく把握するための非常に重要なメソッドです。

ErrorException::getMessage()は、捕捉したエラーの具体的な内容を文字列として取得するメソッドです。これはエラーの原因特定やログ記録に役立ちますが、エラーを自動的に解決する機能ではありません。

サンプルコードのset_error_handler()は、PHPの通常エラーをtry-catchで扱えるようにする強力な設定ですが、スクリプト全体に影響を与えます。そのため、処理後は必ずrestore_error_handler()で元のハンドラに戻すことが極めて重要です。これを忘れると、以降の処理で予期せぬエラーハンドリングが発生する可能性があります。

エラーメッセージをユーザーに直接表示する際は、セキュリティやユーザー体験を考慮し、適切な形に加工する配慮が必要です。また、未定義変数へのアクセスは開発段階でデバッグに役立つことがありますが、本番環境では避けるべきです。

PHP ErrorExceptionのメッセージを取得する

1<?php
2
3/**
4 * PHPの警告や通知レベルのエラーをErrorExceptionとしてスローするエラーハンドラを設定します。
5 * これにより、PHPの通常のエラー(E_WARNING, E_NOTICEなど)を例外として捕捉できるようになります。
6 */
7set_error_handler(function (int $severity, string $message, string $file, int $line): bool {
8    // 現在のエラーレポート設定に含まれないエラーは無視します。
9    // 例えば、エラーレポートがE_ERRORのみに設定されている場合、E_NOTICEは処理しません。
10    if (!(error_reporting() & $severity)) {
11        return false;
12    }
13
14    // PHPエラーをErrorExceptionとしてスローします。
15    // このErrorExceptionは、後のtry-catchブロックで捕捉されます。
16    throw new ErrorException($message, 0, $severity, $file, $line);
17});
18
19try {
20    echo "意図的にPHPの「通知」レベルのエラーを発生させます。\n";
21    
22    // 存在しない変数にアクセスすると、通常はPHP Noticeが発生します。
23    // しかし、上記で設定したエラーハンドラによってErrorExceptionに変換され、例外としてスローされます。
24    $value = $nonExistentVariable; 
25    
26    // 上の行で例外が発生するため、このメッセージは表示されません。
27    echo "このメッセージは表示されません。\n";
28
29} catch (ErrorException $e) {
30    // ErrorExceptionを捕捉します。
31    echo "\nErrorException が捕捉されました。\n";
32    
33    // ErrorException::getMessage() メソッドを使用して、エラーの内容を文字列として取得します。
34    // これは、PHPのエラーハンドラが捕捉したメッセージそのものです。
35    echo "エラーメッセージ: " . $e->getMessage() . "\n";
36
37} catch (Throwable $e) {
38    // ErrorException以外の予期せぬThrowable(例外やエラー)を捕捉する汎用ブロック。
39    // ErrorExceptionはThrowableインターフェースを実装しています。
40    echo "\n予期せぬ Throwable が捕捉されました。\n";
41    echo "メッセージ: " . $e->getMessage() . "\n";
42
43} finally {
44    // 処理の終了後に、カスタムエラーハンドラを元の状態に戻します。
45    // これは、他のコードに影響を与えないための良い習慣です。
46    restore_error_handler();
47    echo "\nプログラムの実行が終了しました。\n";
48}
49

PHP 8のErrorException::getMessageメソッドは、捕捉したErrorExceptionオブジェクトから、そのエラーに関する詳細なメッセージを文字列として取得するために使用されます。このメソッドは引数を取らず、エラーの内容を示す文字列を戻り値として返します。

サンプルコードでは、まずset_error_handler関数を用いて、PHPの通常の警告や通知レベルのエラー(例えば未定義変数へのアクセス)をErrorExceptionというカスタム例外に変換する仕組みを設定しています。これにより、通常はプログラムを停止させないPHPの通知なども、例外としてtry-catchブロックで捕捉できるようになります。

tryブロック内で意図的に存在しない変数にアクセスすると、上記で設定したエラーハンドラが働き、ErrorExceptionがスローされます。このErrorExceptioncatch (ErrorException $e)ブロックで捕捉され、その$eオブジェクトに対して$e->getMessage()が呼び出されます。これにより、「Undefined variable: nonExistentVariable」といった、発生したPHPエラーの具体的な内容が文字列として取得され、画面に表示されます。

このメソッドを利用することで、プログラム内で発生したPHPのエラーや例外の詳細な情報を取得し、ログに出力したり、ユーザーに対して分かりやすいエラーメッセージを表示したりする際に役立てることができます。

このサンプルコードは、set_error_handler関数を用いてPHPの通常の警告や通知をErrorExceptionとして扱い、try-catchブロックで例外として捕捉する方法を示しています。ErrorException::getMessage()は、発生したPHPエラーのメッセージ内容を文字列として取得する際に使用します。

カスタムエラーハンドラを設定すると、指定されたレベルのエラーがすべて例外としてスローされるため、アプリケーションの動作に大きな影響を与えます。そのため、エラーハンドラを設定した後は、必ずfinallyブロックなどでrestore_error_handler()を呼び出し、元の状態に戻すことが非常に重要です。これを怠ると、後続のコードや他のライブラリの動作に予期せぬ影響を与える可能性があります。

特に本番環境でこの仕組みを導入する際は、すべての警告や通知を例外に変換するとアプリケーションが頻繁に停止する恐れがあるため、エラーレポートレベルの調整や適用範囲を慎重に検討する必要があります。

関連コンテンツ

関連IT用語