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

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

作成日: 更新日:

基本的な使い方

getCodeメソッドは、発生したエラーや例外のコードを取得するメソッドです。このメソッドは、PHPの組み込みエラーを例外として扱うために用いられるErrorExceptionクラスに属しており、PHPの内部で発生したエラーの種類を識別するための数値(エラーコード)を提供します。

システム開発において、エラーは避けられない要素です。プログラムが予期せぬ動作をした際に、単にエラーが発生したという事実だけでなく、具体的に「どのような問題が起きたのか」を把握することは、問題の特定と解決、そして適切なエラー処理の実装にとって不可欠です。getCodeメソッドは、この「どのような問題か」を示す数値情報を取得する役割を担います。

例えば、データベース接続の失敗、ファイルへの書き込み権限がないといった様々なエラー状況が発生した場合、それぞれの種類に応じて異なるエラーコードが返されます。開発者はこのエラーコードを利用することで、エラーの種類に基づいてプログラムの動作を分岐させたり、より詳細なエラーメッセージをユーザーに表示したり、あるいはログに記録したりすることが可能になります。

このメソッドが返す値は整数型であり、PHPが定義する標準のエラー定数(E_WARNINGE_NOTICEなど)に対応する数値であることもあれば、アプリケーション開発者が独自に定義した特定のエラーを示すコードである場合もあります。getCodeメソッドを活用することで、開発者はエラーハンドリングのロジックをより詳細かつ柔軟に設計できるようになり、結果として堅牢で保守しやすいアプリケーションの構築に貢献します。

構文(syntax)

1<?php
2
3try {
4    throw new ErrorException("エラーメッセージ", 123);
5} catch (ErrorException $e) {
6    $errorCode = $e->getCode();
7    // $errorCode には 123 が格納される
8}
9
10?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

このメソッドは、例外に関連付けられたエラーコードを整数型で返します。

サンプルコード

PHP ErrorException::getCode()でエラーコードを取得する

1<?php
2
3/**
4 * PHPの標準エラーをErrorExceptionとして捕捉し、そのエラーコードを取得する例です。
5 * ErrorException::getCode() メソッドは、例外に関連付けられたエラーコード(通常はエラーレベル)を返します。
6 */
7function demonstrateErrorExceptionGetCode(): void
8{
9    // カスタムエラーハンドラを設定します。
10    // PHPで発生する通常のエラー(例: 警告、通知)をErrorExceptionに変換してスローします。
11    set_error_handler(function (int $severity, string $message, string $file, int $line) {
12        // 現在のエラーレポート設定でこのエラーが抑制されていないか確認します。
13        // error_reporting() の設定によって無視されるエラーは変換しません。
14        if (!(error_reporting() & $severity)) {
15            return false;
16        }
17        // エラー情報を基にErrorExceptionを作成し、スローします。
18        // $code 引数はここでは 0 としていますが、getCode() は $severity の値を返します。
19        throw new ErrorException($message, 0, $severity, $file, $line);
20    });
21
22    try {
23        // 意図的に警告(E_WARNING)を発生させるコードです。
24        // 未定義の変数を参照すると、通常 E_WARNING が発生します。
25        $undefinedVariable = null; // 変数を初期化
26        echo $undefinedVariable->someProperty; // nullのプロパティにアクセスし、E_WARNING を発生させる
27
28    } catch (ErrorException $e) {
29        // ErrorException を捕捉した場合の処理です。
30        echo "エラーが発生しました。\n";
31        echo "メッセージ: " . $e->getMessage() . "\n";
32        // getCode() メソッドを呼び出し、エラーコード(エラーレベル)を取得します。
33        $errorCode = $e->getCode();
34        echo "取得したエラーコード (エラーレベル): " . $errorCode . "\n";
35
36        // 取得したコードがどのエラーレベルに相当するか確認します。
37        // この場合、E_WARNING 定数の値と比較されます。
38        if ($errorCode === E_WARNING) {
39            echo "このエラーコードは E_WARNING 定数と一致します。\n";
40        } elseif ($errorCode === E_NOTICE) {
41            echo "このエラーコードは E_NOTICE 定数と一致します。\n";
42        }
43
44    } finally {
45        // スクリプトの実行が完了した後、カスタムエラーハンドラを元の状態に戻します。
46        // これにより、他の部分でのエラー処理に影響を与えないようにします。
47        restore_error_handler();
48    }
49}
50
51// 定義した関数を実行します。
52demonstrateErrorExceptionGetCode();
53

このPHPコードは、PHPの標準的なエラー(警告など)をErrorExceptionという例外として扱い、そのエラーコードを取得する方法を示します。ErrorException::getCode()メソッドは、例外インスタンスに関連付けられたエラーの重大度レベルを整数値で返します。このメソッドに引数は必要ありません。

サンプルコードでは、まずset_error_handler関数を使い、発生したエラーをErrorExceptionに変換してスロー(送出)するよう設定しています。次にtryブロック内で、null値のプロパティにアクセスすることで意図的に警告(E_WARNING)を発生させます。この警告は設定したエラーハンドラによってErrorExceptionとしてcatchブロックで捕捉されます。

catchブロック内では、捕捉した例外オブジェクトのgetCode()メソッドを呼び出し、エラーコードを取得しています。このコードは、発生したエラーの種類(E_WARNINGE_NOTICEなど)に対応する整数値です。最後に、取得したエラーコードがPHPの定義済み定数E_WARNINGと一致することを確認しています。このように、getCode()を使うことで、プログラムはエラーの種類を正確に識別し、その種類に応じた適切な対応を行うことができます。

ErrorExceptiongetCode()メソッドは、new ErrorExceptionの2番目の引数(コード)ではなく、3番目の引数で指定したエラーの深刻度(エラーレベル定数)を返す点に注意が必要です。これは、一般的なExceptionクラスの挙動と異なるため特に重要です。また、set_error_handlerでエラー処理方法を変更した際は、処理後に必ずrestore_error_handlerを呼び出し、設定を元に戻してください。これを忘れると、スクリプトの他の部分に意図しない影響を与える可能性があります。エラーハンドラ内では、error_reporting()の設定を尊重することで、意図的に抑制されたエラーを捕捉しないようにするのが安全な実装です。

PHP ErrorException::getCode() でエラーコードを取得する

1<?php
2
3/**
4 * PHPのネイティブエラーを ErrorException に変換するカスタムエラーハンドラ
5 *
6 * @param int    $errno   エラーレベル
7 * @param string $errstr  エラーメッセージ
8 * @param string $errfile エラーが発生したファイル名
9 * @param int    $errline エラーが発生した行番号
10 * @return bool
11 * @throws ErrorException
12 */
13function handleErrorsAsExceptions(int $errno, string $errstr, string $errfile, int $errline): bool
14{
15    // @演算子で抑制されたエラーは処理しない
16    if (!(error_reporting() & $errno)) {
17        return false;
18    }
19
20    // PHPエラーをErrorExceptionとしてスローする
21    // この $errno が getCode() で取得される値となる
22    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
23}
24
25// 作成したカスタムエラーハンドラを登録
26set_error_handler('handleErrorsAsExceptions');
27
28try {
29    // 意図的に警告 (E_WARNING) を発生させる
30    // 存在しないファイルを読み込もうとすると E_WARNING が発生する
31    file_get_contents('non_existent_file.txt');
32} catch (ErrorException $e) {
33    // スローされた ErrorException をキャッチする
34    echo "例外をキャッチしました。" . PHP_EOL;
35
36    // getCode() メソッドを使って、元のPHPエラーレベル(エラーコード)を取得する
37    $errorCode = $e->getCode();
38    echo "エラーコード: " . $errorCode . PHP_EOL;
39
40    // 取得したエラーコードとPHPの定義済み定数を比較することで、エラーの種類を判別できる
41    if ($errorCode === E_WARNING) {
42        echo "エラーの種類は 警告 (E_WARNING) です。" . PHP_EOL;
43    }
44
45    // 参考:その他の情報も取得できる
46    echo "メッセージ: " . $e->getMessage() . PHP_EOL;
47
48} finally {
49    // スクリプトの他の部分に影響を与えないよう、エラーハンドラを元に戻す
50    restore_error_handler();
51}

ErrorException::getCode() メソッドは、PHPの標準エラーが例外として変換された際に、その元となったエラーの重大度レベル(エラーコード)を整数で取得するために使用します。このメソッドに引数はなく、戻り値としてエラーコードを表す整数 (int) を返します。

このサンプルコードでは、まず set_error_handler 関数を用いて、PHPが標準で発生させる警告や通知などのエラーを、プログラムで処理できる ErrorException という例外に変換するカスタム関数を登録しています。

try ブロック内で、存在しないファイルを読み込もうとして意図的に警告 (E_WARNING) を発生させると、登録したカスタム関数がそれを検知し、ErrorException がスローされます。続く catch ブロックでは、スローされた ErrorException オブジェクトを $e という変数で受け取ります。

ここで $e->getCode() を呼び出すと、例外が作られる原因となったエラーレベル、この場合は E_WARNING に対応する整数値が返されます。取得したエラーコードを E_WARNING などのPHP定義済み定数と比較することで、発生したエラーの種類を正確に判別し、エラーに応じた適切な処理を実行できます。

ErrorExceptiongetCode()メソッドは、set_error_handlerでPHPのネイティブエラーを例外に変換した際に、元のエラーレベル(エラーコード)を取得するために使います。この値はErrorExceptionのコンストラクタの第3引数で設定された整数値です。注意点として、set_error_handlerはPHPの標準エラー処理を上書きするため、処理が終わったら必ずrestore_error_handler()で元に戻しましょう。そうしないと、アプリケーションの他の部分で予期せぬ動作を引き起こす可能性があります。また、サンプルコードにあるerror_reporting()を使ったチェックは、@演算子で意図的に抑制されたエラーを無視するための重要な記述です。この仕組みにより、取得したエラーコードをE_WARNINGのような定数と比較して、エラーの種類に応じた適切な処理を実装できます。

関連コンテンツ