【PHP8.x】OutOfBoundsException::codeプロパティの使い方
codeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
codeプロパティは、例外に関するエラーコードを保持するプロパティです。このプロパティはOutOfBoundsExceptionクラスが独自に定義したものではなく、基底クラスであるExceptionクラスから継承されています。そのため、PHPにおける多くの標準例外クラスで共通して利用することが可能です。OutOfBoundsExceptionのインスタンスを生成する際に、コンストラクタの第二引数に整数値を渡すことで、このcodeプロパティに任意のエラーコードを設定できます。もし第二引数を省略した場合、codeプロパティの値はデフォルトで0となります。try...catchブロックで例外を捕捉した際に、getCode()メソッドを使ってこの値を取得することにより、同じ例外クラスであってもエラーコードに基づいて処理を細かく分岐させることができます。これにより、配列の範囲外アクセスが発生した具体的な原因をプログラムで識別し、より詳細で的確なエラーハンドリングを実装するために役立ちます。
構文(syntax)
1<?php 2 3try { 4 // 第2引数に整数値で例外コードを指定して、例外インスタンスをスローします。 5 throw new OutOfBoundsException("指定されたインデックスは範囲外です。", 404); 6} catch (OutOfBoundsException $e) { 7 // getCode() メソッドを使って、設定された例外コードを取得します。 8 echo $e->getCode(); 9} 10 11?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
このプロパティ code は、例外が発生した際の内部的なエラーコードを表す整数値を返します。
サンプルコード
PHP OutOfBoundsExceptionで設定キーエラーを処理する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * CodeIgniterのモデルやライブラリでの設定値取得を模したクラスです。 7 * OutOfBoundsExceptionを利用して、範囲外のキーが指定された際の 8 * エラー処理を示します。 9 */ 10class ConfigLoader 11{ 12 /** 13 * アプリケーションの設定値を保持する配列 14 * @var array<string, mixed> 15 */ 16 private array $config = [ 17 'database' => [ 18 'hostname' => 'localhost', 19 'username' => 'root', 20 'password' => 'password', 21 'database' => 'ci_db', 22 ], 23 'app' => [ 24 'baseURL' => 'http://example.com/', 25 'indexPage' => 'index.php', 26 ], 27 ]; 28 29 /** 30 * 設定値を取得します。 31 * 32 * @param string $key 取得したい設定のキー 33 * @return mixed 設定値 34 * @throws OutOfBoundsException キーが存在しない場合にスローされます 35 */ 36 public function get(string $key): mixed 37 { 38 if (!array_key_exists($key, $this->config)) { 39 // 存在しないキーが指定された場合、OutOfBoundsExceptionをスローします。 40 // 第2引数で、アプリケーション固有のエラーコードを指定できます。 41 // ここでは「設定キー未定義」を示すカスタムコード 1001 を使用します。 42 throw new OutOfBoundsException("Configuration key '{$key}' not found.", 1001); 43 } 44 return $this->config[$key]; 45 } 46} 47 48// --- 実行コード --- 49 50$config = new ConfigLoader(); 51 52// 存在するキーを取得する 53try { 54 $dbConfig = $config->get('database'); 55 echo "Database Host: " . ($dbConfig['hostname'] ?? 'N/A') . PHP_EOL; 56} catch (OutOfBoundsException $e) { 57 echo "Error: " . $e->getMessage() . PHP_EOL; 58} 59 60echo "-------------------------" . PHP_EOL; 61 62// 存在しないキーを取得しようとすると、例外がスローされる 63try { 64 $mailerConfig = $config->get('mailer'); 65 print_r($mailerConfig); 66} catch (OutOfBoundsException $e) { 67 // 捕捉した例外からメッセージとコードを取得して表示します。 68 // $e->getCode() は例外に設定された int 型のコードを返します。 69 $errorCode = $e->getCode(); 70 71 echo "An exception occurred!" . PHP_EOL; 72 echo "Message: " . $e->getMessage() . PHP_EOL; 73 echo "Error Code: " . $errorCode . PHP_EOL; // 例外に設定されたコード 1001 が表示される 74 75 // CodeIgniterの環境では、このコードを元にログレベルを変更したり、 76 // ユーザーへの表示を切り替えたりする処理が考えられます。 77 if ($errorCode === 1001) { 78 // 本来はCodeIgniterのロガーを使用する 79 error_log("[ERROR] Critical configuration is missing."); 80 } 81}
OutOfBoundsExceptionのcodeプロパティは、例外に設定された整数型の「例外コード」を取得するために使用します。これは、エラーメッセージとは別に、プログラムがエラーの種類を機械的に識別するための数値です。
このサンプルコードでは、ConfigLoaderクラスが設定値を管理しています。getメソッドは、存在しない設定キー(例: 'mailer')が指定されると、OutOfBoundsExceptionをthrow(スロー)します。例外を生成する際、new OutOfBoundsException("...", 1001)のように第2引数に1001という整数値を指定しています。これが例外コードとしてオブジェクトに保存されます。
try...catchブロックでこの例外を捕捉した後、$e->getCode()メソッドを呼び出すことで、設定された例外コード1001を取得できます。このメソッドに引数は不要で、戻り値はint型(整数)です。
CodeIgniterのようなフレームワークでは、このコード値を利用して、特定のエラーコードだったらログのレベルを変えるなど、エラーの種類に応じた処理を条件分岐で実装するのに役立ちます。
このサンプルコードは、例外処理の基本を示しています。try...catch構文を使わないと、存在しない設定キーにアクセスした際にプログラムがエラーで停止してしまいます。OutOfBoundsExceptionは、配列などで範囲外のキーが指定されたことを示すための専用の例外です。throwで例外を生成する際、第2引数に任意の整数値(エラーコード)を指定でき、これはcatchブロック内で$e->getCode()メソッドを使って取得できます。エラーメッセージの文字列内容に頼るよりも、このエラーコードで処理を分岐させる方が、より確実で安定したエラーハンドリングが可能です。CodeIgniterのようなフレームワークでは、この仕組みを利用してエラーの種類に応じたログ記録やユーザーへの通知を行うのが一般的です。
PHPでOutOfBoundsExceptionを処理する
1<?php 2 3/** 4 * 指定されたインデックスの値を取得します。 5 * 6 * インデックスが配列の範囲外である場合、例外コードを付けて 7 * OutOfBoundsException をスローします。 8 * 9 * @param array<int, string> $data データ配列 10 * @param int $index 取得する値のインデックス 11 * @return string インデックスに対応する値 12 * @throws OutOfBoundsException 指定されたインデックスが存在しない場合 13 */ 14function getValueAtIndex(array $data, int $index): string 15{ 16 if (!isset($data[$index])) { 17 // 例外をスローする際に、第2引数でエラーコード(int)を指定できる 18 throw new OutOfBoundsException('指定されたインデックスは範囲外です。', 1001); 19 } 20 return $data[$index]; 21} 22 23// サンプルデータ 24$userNames = [0 => 'Alice', 1 => 'Bob', 2 => 'Carol']; 25 26try { 27 // 存在しないインデックス(5)にアクセスしようとする 28 echo 'インデックス 5 のユーザー名を取得します...' . PHP_EOL; 29 $userName = getValueAtIndex($userNames, 5); 30 echo $userName . PHP_EOL; 31} catch (OutOfBoundsException $e) { 32 // 捕捉した例外のプロパティ(code)を getCode() メソッドで取得する 33 echo 'エラーが発生しました。' . PHP_EOL; 34 echo 'エラーコード: ' . $e->getCode() . PHP_EOL; 35 echo 'メッセージ: ' . $e->getMessage() . PHP_EOL; 36}
このPHPサンプルコードは、配列の範囲外のインデックスにアクセスした際に発生する OutOfBoundsException の使い方と、それに付随するエラーコードの取得方法を示しています。
OutOfBoundsException は、配列などで存在しないキーやインデックスを指定した際に発生するエラーを表現するための例外クラスです。この例外を throw する際、コンストラクタの第1引数にエラーメッセージ(文字列)、第2引数にエラーコード(整数)を指定できます。サンプルコードの getValueAtIndex 関数では、インデックスが存在しない場合にエラーコード 1001 を持つ OutOfBoundsException をスローしています。
try-catch構文の catch ブロックでこの例外を捕捉すると、例外オブジェクトの getCode() メソッドを呼び出すことができます。getCode() メソッドは引数を取らず、例外が生成されたときに設定されたエラーコードを整数(int)で返します。このコードでは、捕捉した例外オブジェクト $e から $e->getCode() を使ってエラーコード 1001 を取得し、メッセージと共に出力しています。このようにエラーコードを利用することで、エラーメッセージの文言に依存せず、エラーの種類を数値で判別して、コードに応じた分岐処理などを実装することが可能になります。
例外を生成する際、コンストラクタの第2引数に整数でエラーコードを指定できます。このコードは、catch ブロックで getCode() メソッドを用いて取得します。もしコードを指定せずに例外をスローした場合、getCode() の戻り値はデフォルトで 0 になります。エラーコードは、単に表示するだけでなく、catch した例外の種類をコードの値によって細かく判別し、処理を分岐させるために活用されます。例えば、コード 1001 は「インデックス範囲外」、1002 は「不正な値」のように、アプリケーション内で独自のルールを定めることで、より詳細で体系的なエラーハンドリングが可能になり、デバッグや保守の効率が向上します。