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

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

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

作成日: 更新日:

基本的な使い方

getMessageメソッドは、エラーや例外が発生した際に、そのエラーに関する詳細なメッセージを取得するメソッドです。

このメソッドが所属するArithmeticErrorクラスは、PHPにおいて算術演算に起因するエラー(例えば、ゼロによる除算や数値が扱える範囲を超えた場合など)を表すために用いられます。ArithmeticErrorは、プログラムの実行中に発生する可能性のある深刻な問題の一つであり、基本的なErrorクラスの派生クラスとして定義されています。

getMessageメソッドは、ArithmeticErrorオブジェクトから具体的なエラー内容を文字列として取り出すために利用されます。例えば、try-catchブロックで算術エラーを捕捉した場合、catchブロック内でこのメソッドを呼び出すことで、「ゼロで割ることはできません」といった、エラーの具体的な説明文を取得することができます。

取得されたメッセージは、開発者がプログラムのどこで、どのような種類の問題が発生したのかを把握し、デバッグ作業を進める上で非常に重要な情報源となります。また、エンドユーザーに対してエラー内容を分かりやすく提示する際にも活用できます。getMessageメソッドは、PHPの堅牢なエラーハンドリングにおいて、エラーの状況を把握するための基本的な手段として広く用いられています。

構文(syntax)

1<?php
2
3try {
4    // ArithmeticError を発生させる操作 (例: 0による除算)
5    $result = intdiv(10, 0);
6    echo "結果: " . $result;
7} catch (ArithmeticError $e) {
8    // 捕捉した ArithmeticError オブジェクトからエラーメッセージを取得する
9    echo $e->getMessage();
10}
11
12?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

ArithmeticErrorクラスのgetMessageメソッドは、エラーが発生した際にその詳細を表す文字列を返します。

サンプルコード

PHP $e->getMessage() で算術エラーメッセージを取得する

1<?php
2
3/**
4 * ArithmeticError の発生をシミュレートし、getMessage() メソッドで
5 * エラーメッセージを取得するデモンストレーション関数です。
6 * システムエンジニアを目指す初心者向けに、エラーハンドリングの基本を示します。
7 */
8function demonstrateGetMessageOnArithmeticError(): void
9{
10    echo "--- ArithmeticError の発生とメッセージの取得 ---" . PHP_EOL;
11
12    try {
13        // ゼロによる除算は DivisionByZeroError をスローします。
14        // DivisionByZeroError は ArithmeticError クラスを継承しています。
15        $numerator = 10;
16        $denominator = 0;
17        $result = $numerator / $denominator; // ここでエラーが発生します
18
19        // エラーが発生したため、この行は実行されません
20        echo "計算結果: " . $result . PHP_EOL;
21    } catch (ArithmeticError $e) {
22        // ArithmeticError またはそれを継承するエラーを捕捉します。
23        // ここでは DivisionByZeroError を捕捉します。
24        echo "算術エラーを捕捉しました。" . PHP_EOL;
25
26        // $e->getMessage() を使用して、エラーオブジェクトが持つメッセージを取得します。
27        echo "エラーメッセージ: " . $e->getMessage() . PHP_EOL;
28        echo "エラー発生ファイル: " . $e->getFile() . PHP_EOL;
29        echo "エラー発生行: " . $e->getLine() . PHP_EOL;
30    } catch (Throwable $e) {
31        // ArithmeticError 以外の予期せぬエラーが発生した場合に捕捉します。
32        // Throwable は全ての例外とエラーの基底インターフェースです。
33        echo "予期せぬエラーが発生しました: " . $e->getMessage() . PHP_EOL;
34    }
35
36    echo "--- エラーハンドリング後も処理は継続されます ---" . PHP_EOL;
37}
38
39// 上記で定義した関数を実行し、動作を確認します。
40demonstrateGetMessageOnArithmeticError();
41

PHP 8におけるArithmeticErrorクラスのgetMessageメソッドは、プログラム実行中に発生した算術エラーの詳細な内容を文字列として取得するために使用されます。このメソッドは引数を必要とせず、エラーオブジェクトが保持する具体的なエラーメッセージを文字列型で返します。システムエンジニアを目指す上で、エラー発生時にプログラムが予期せず停止するのを防ぎ、問題の原因を正確に特定するためには、エラーハンドリングが非常に重要となります。

提供されたサンプルコードでは、ゼロによる除算という算術演算によってDivisionByZeroErrorArithmeticErrorを継承するエラー)が発生する状況を想定し、try-catchブロックでそのエラーを捕捉しています。エラーが捕捉されると、catchブロック内でエラーオブジェクト(サンプルでは$e)が生成され、$e->getMessage()を呼び出すことで、「Division by zero」といったエラーの具体的な内容を示すメッセージを取得できます。このメッセージは、エラーログの記録や、ユーザーへの適切な情報提供など、エラー発生後の対応を適切に行う上で不可欠な情報源となります。getMessage()は、エラーオブジェクトからエラーの詳細情報を引き出し、プログラムの安定性を高めるための基本的な手段です。

$e->getMessage()は、エラーの具体的な内容を文字列で取得する際に使用します。エラーによってプログラムが予期せず停止しないよう、発生する可能性のある処理は必ずtry-catchで囲みましょう。

catchブロックでは、DivisionByZeroErrorのような特定の算術エラーを上位クラスのArithmeticErrorで捕捉できます。複数のcatchを使用する際は、ArithmeticErrorのように具体的なエラーを先に、Throwableのような汎用的なものを後に記述する順序が適切です。

エラーメッセージだけでなく、getFile()getLine()も利用してエラーの発生場所を特定すると、デバッグが容易になります。ただし、本番環境では取得したエラーメッセージをそのまま利用者に表示せず、ログ記録に留めるか、適切な内容に変換して提供する配慮が必要です。

PHP ArithmeticError getMessage オーバーライド

1<?php
2
3/**
4 * ArithmeticError は PHP の組み込みエラークラスの一つで、
5 * 数学的な計算のエラー(例: ゼロ除算)が発生したときに使われる Error クラスのサブクラスです。
6 *
7 * このサンプルコードでは、ArithmeticError を継承して独自のカスタムエラークラスを作成し、
8 * その中で getMessage() メソッドをオーバーライド(上書き)する方法を示します。
9 * これにより、エラーメッセージに独自の追加情報を付加することができます。
10 */
11class CustomCalculationError extends ArithmeticError
12{
13    /**
14     * エラーメッセージに付加する追加情報
15     * @var string
16     */
17    private string $additionalInfo;
18
19    /**
20     * コンストラクタ
21     *
22     * @param string $message エラーの基本メッセージ
23     * @param int $code エラーコード
24     * @param Throwable|null $previous 前のエラー(例外チェーン用)
25     * @param string $additionalInfo メッセージに含める追加情報
26     */
27    public function __construct(string $message = "", int $code = 0, ?Throwable $previous = null, string $additionalInfo = "")
28    {
29        // 親クラス(ArithmeticError)のコンストラクタを呼び出します
30        parent::__construct($message, $code, $previous);
31        $this->additionalInfo = $additionalInfo;
32    }
33
34    /**
35     * 親クラスの getMessage() メソッドをオーバーライドし、
36     * 元のメッセージに追加情報を付加して返します。
37     *
38     * @return string カスタムされたエラーメッセージ
39     */
40    public function getMessage(): string
41    {
42        // 親クラスの getMessage() を呼び出して元のメッセージを取得します
43        $originalMessage = parent::getMessage();
44        // 取得した元のメッセージと、このクラス独自の追加情報を組み合わせて返します
45        return "カスタム計算エラー (コード: {$this->getCode()}): " . $originalMessage . " [詳細情報: " . $this->additionalInfo . "]";
46    }
47
48    /**
49     * 追加情報を取得するカスタムメソッド
50     *
51     * @return string
52     */
53    public function getAdditionalInfo(): string
54    {
55        return $this->additionalInfo;
56    }
57}
58
59/**
60 * 割り算を行う関数。ゼロ除算が発生した場合に CustomCalculationError をスローします。
61 *
62 * @param int $numerator 分子
63 * @param int $denominator 分母
64 * @return float 計算結果
65 * @throws CustomCalculationError ゼロ除算が発生した場合
66 */
67function divide(int $numerator, int $denominator): float
68{
69    if ($denominator === 0) {
70        // ゼロ除算エラーが発生したとみなし、CustomCalculationError をスローします。
71        // このエラーのメッセージは、CustomCalculationError クラスでオーバーライドされた
72        // getMessage() メソッドによって加工されます。
73        throw new CustomCalculationError(
74            "ゼロによる除算は許可されていません。", // エラーの基本メッセージ
75            1001,                                  // カスタムエラーコード
76            null,                                  // 前のエラーはなし
77            "分母に0が指定されたため、計算できません。" // メッセージに付加する追加情報
78        );
79    }
80    return $numerator / $denominator;
81}
82
83// --- コードの実行部分 ---
84
85echo "--- 計算実行 ---" . PHP_EOL;
86
87try {
88    // 正常な計算の例
89    $result1 = divide(10, 2);
90    echo "10 / 2 = " . $result1 . PHP_EOL;
91
92    echo PHP_EOL;
93
94    // ゼロ除算エラーが発生する例
95    // ここで CustomCalculationError がスローされ、catch ブロックに処理が移ります。
96    $result2 = divide(10, 0);
97    echo "10 / 0 = " . $result2 . PHP_EOL; // この行は実行されません
98
99} catch (CustomCalculationError $e) {
100    // CustomCalculationError が捕捉された場合の処理
101    echo "--- CustomCalculationError を捕捉しました ---" . PHP_EOL;
102    // オーバーライドされた getMessage() メソッドの結果が表示されます。
103    echo "カスタムエラーメッセージ: " . $e->getMessage() . PHP_EOL;
104    echo "エラーコード: " . $e->getCode() . PHP_EOL;
105    echo "エラー発生ファイル: " . $e->getFile() . PHP_EOL;
106    echo "エラー発生行: " . $e->getLine() . PHP_EOL;
107    // カスタムで追加した情報も取得できます。
108    echo "追加情報 (getAdditionalInfo()から): " . $e->getAdditionalInfo() . PHP_EOL;
109} catch (Throwable $e) {
110    // その他の予期せぬエラーが捕捉された場合の処理
111    // この例では CustomCalculationError のみがスローされるため、通常ここには到達しません。
112    echo "--- 予期せぬエラーを捕捉しました ---" . PHP_EOL;
113    echo "エラーメッセージ: " . $e->getMessage() . PHP_EOL;
114    echo "エラーコード: " . $e->getCode() . PHP_EOL;
115}
116
117echo PHP_EOL . "--- 実行終了 ---" . PHP_EOL;

PHP 8のArithmeticErrorは、ゼロ除算のような数学的な計算エラーが発生した際に利用される組み込みエラークラスです。そのgetMessage()メソッドは、引数なしで、発生したエラーのメッセージを文字列として返します。

このサンプルコードでは、ArithmeticErrorを継承してCustomCalculationErrorという独自のカスタムエラークラスを作成し、その中でgetMessage()メソッドをオーバーライド(上書き)する方法を示しています。これにより、エラー発生時に返されるメッセージに、より詳細な情報を付加できるようになります。

CustomCalculationErrorクラスのgetMessage()メソッドは、親クラスの元のエラーメッセージに、このクラス独自の追加情報を組み合わせて、整形されたカスタムエラーメッセージを文字列として返します。divide関数は、ゼロ除算が発生した場合にこのCustomCalculationErrorをスローし、try-catchブロックでエラーを捕捉します。捕捉されたエラーオブジェクトに対してgetMessage()を呼び出すと、オーバーライドによって加工された、詳細なカスタムエラーメッセージが表示され、エラーの原因特定に役立てることができます。

このサンプルコードは、PHPの組み込みエラークラスであるArithmeticErrorを継承し、getMessage()メソッドをオーバーライドして独自のカスタムエラーメッセージを作成する方法を示しています。カスタムエラークラスを作る際は、parent::getMessage()を呼び出して親クラスの元のメッセージを維持しつつ、独自の追加情報を付加することが重要です。これにより、エラーの基本的な情報とカスタムの詳しい情報を両方提供できます。getMessage()は、エラー発生時の状況を開発者や利用者に伝える重要な役割を担うため、メッセージは明確で一貫性のあるものに設計しましょう。特定のビジネスロジックに特化したエラーを識別し、追加情報を渡したい場合に、このようなカスタムエラークラスを活用すると良いでしょう。

PHP ArithmeticErrorメッセージの短縮(truncate)

1<?php
2
3/**
4 * ArithmeticErrorを捕捉し、そのメッセージを短縮して表示するサンプル関数
5 *
6 * この関数は、意図的にビットシフト演算でArithmeticErrorを発生させ、
7 * try-catchブロックで捕捉します。
8 * catchブロック内では、getMessage()メソッドでエラーメッセージを取得し、
9 * 長いメッセージをログ記録などのために短縮(truncate)する例を示します。
10 */
11function demonstrateTruncatedErrorMessage(): void
12{
13    try {
14        // 負のビット数でシフトすると ArithmeticError がスローされる
15        $value = 1 << -1;
16    } catch (ArithmeticError $e) {
17        // getMessage() を使ってエラーメッセージ全体を取得する
18        $fullMessage = $e->getMessage();
19        echo "Original message:\n";
20        echo $fullMessage . "\n\n";
21
22        // メッセージが30文字より長い場合、省略記号をつけて短縮(truncate)する
23        $maxLength = 30;
24        $truncatedMessage = mb_strimwidth($fullMessage, 0, $maxLength, '...');
25
26        echo "Truncated message:\n";
27        echo $truncatedMessage . "\n";
28    }
29}
30
31// 関数を実行して結果を確認します
32demonstrateTruncatedErrorMessage();

このサンプルコードは、PHPで算術演算に関するエラー(ArithmeticError)が発生した際に、そのエラーメッセージを取得し、表示用に短縮する方法を示しています。

tryブロック内では、負の数によるビットシフト演算 (1 << -1) を意図的に実行しています。PHP 8以降、この操作はArithmeticErrorという例外を発生させます。catchブロックは、この発生したArithmeticErrorを捕捉し、エラー情報を持つ例外オブジェクトを引数$eとして受け取ります。

ここで使われているgetMessage()メソッドは、捕捉した例外オブジェクト$eが持つメソッドです。このメソッドは引数を取らず、エラーの具体的な内容を説明する文字列を戻り値として返します。コードでは、まずgetMessage()で取得した元のエラーメッセージをそのまま表示しています。次に、ログへの記録などで長いメッセージを簡潔にしたい場合を想定し、mb_strimwidth関数を使って文字列を30文字に短縮(truncate)し、末尾に省略記号「...」を付加して表示しています。このようにgetMessage()を利用することで、発生したエラーの詳細をプログラムで取得し、柔軟に処理することができます。

getMessageメソッドで取得できるエラーメッセージは、PHPのバージョンや設定によって内容が変わる可能性があります。そのため、メッセージの特定の文言に依存する処理は避けるべきです。例外を捕捉する際は、サンプルのようにArithmeticErrorなど、想定される具体的なエラークラスをcatchで指定することが推奨されます。これにより、予期せぬ他のエラーまで捕捉してしまうことを防ぎ、問題の特定が容易になります。また、ログ出力などでメッセージを短縮する場合、mb_strimwidth関数を使うと日本語などのマルチバイト文字も文字化けせずに安全に扱えます。

関連コンテンツ