【PHP8.x】OutOfRangeException::codeプロパティの使い方
codeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『codeプロパティは、スローされたOutOfRangeException例外に固有の整数コードを保持するプロパティです。このプロパティは、例外が発生した具体的な原因をプログラム上で識別するために使用されます。OutOfRangeExceptionは、配列などで範囲外のインデックスにアクセスしようとした際などに発生する例外ですが、同じ例外の中でも状況に応じて異なるエラーコードを割り当てることができます。このcodeプロパティは、PHPの全ての例外の基底クラスであるExceptionクラスから継承されたものであり、デフォルト値は0です。例外オブジェクトを生成する際、コンストラクタの第二引数に任意の整数値を渡すことで、このプロパティに値を設定できます。try...catch構文で例外を捕捉した際には、getCode()メソッドを呼び出すことで設定された値を取得できます。取得したエラーコードをif文やswitch文で評価することにより、コードの値に応じた具体的なエラー処理、例えばユーザーへの通知内容の変更や、ログ記録の詳細度の調整などを実装でき、より堅牢なプログラムを構築することが可能になります。』
構文(syntax)
1<?php 2 3try { 4 // 例外コード 404 を指定して OutOfRangeException をスローする 5 throw new OutOfRangeException("インデックスが範囲外です。", 404); 6} catch (OutOfRangeException $e) { 7 // 捕捉した例外のコードを取得して出力する 8 // public int getCode(void) 9 echo $e->getCode(); 10} 11 12?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
このプロパティは、例外が発生した際に、その原因を示す整数コードを返します。
サンプルコード
CodeIgniterでOutOfRangeExceptionを扱う
1<?php 2 3declare(strict_types=1); 4 5/** 6 * CodeIgniterのコントローラを模したクラス 7 * 8 * 記事データを管理し、指定されたインデックスの記事を表示します。 9 * 範囲外のインデックスが指定された場合に OutOfRangeException を使用します。 10 */ 11class BlogController 12{ 13 // サンプル用の記事データ配列 14 private array $posts = [ 15 0 => 'CodeIgniter 4 入門', 16 1 => 'PHP 8 の新機能', 17 2 => '例外処理のベストプラクティス', 18 ]; 19 20 /** 21 * 指定されたインデックスの記事を表示します。 22 * 23 * @param int $index 表示したい記事のインデックス 24 */ 25 public function showPost(int $index): void 26 { 27 try { 28 // 配列に指定されたインデックスが存在するかチェック 29 if (!isset($this->posts[$index])) { 30 // 存在しない場合、OutOfRangeExceptionをスローする 31 // 第1引数: エラーメッセージ 32 // 第2引数: エラーコード (HTTPステータスコード 404 Not Found を模倣) 33 throw new OutOfRangeException('指定された記事は見つかりません。', 404); 34 } 35 36 // 記事が存在する場合、タイトルを表示 37 echo "記事タイトル: " . $this->posts[$index] . PHP_EOL; 38 39 } catch (OutOfRangeException $e) { 40 // OutOfRangeExceptionをキャッチしてエラーハンドリングを行う 41 echo "エラーが発生しました。" . PHP_EOL; 42 // getMessage() で例外メッセージを取得 43 echo "メッセージ: " . $e->getMessage() . PHP_EOL; 44 // getCode() で例外に設定されたエラーコードを取得 45 echo "エラーコード: " . $e->getCode() . PHP_EOL; 46 } 47 } 48} 49 50// コントローラのインスタンスを作成 51$controller = new BlogController(); 52 53// --- 実行例 --- 54 55// 1. 成功するケース (インデックス 1 は存在する) 56echo "--- 存在する記事 (index: 1) を表示 ---" . PHP_EOL; 57$controller->showPost(1); 58 59echo PHP_EOL; 60 61// 2. 例外が発生するケース (インデックス 5 は存在しない) 62echo "--- 存在しない記事 (index: 5) を表示 ---" . PHP_EOL; 63$controller->showPost(5);
このPHPサンプルコードは、例外処理の一種である OutOfRangeException と、そのエラーコードを取得する code プロパティ(getCode() メソッド経由でアクセス)の使用法を解説するものです。このコードは、WebフレームワークのCodeIgniterにおけるコントローラの動作を模しており、ブログ記事の配列から指定されたインデックスの記事データを表示します。
showPost メソッドは、引数で渡されたインデックスが記事データ配列に存在しない場合、意図的に OutOfRangeException を発生させます。例外を発生(スロー)させる際、第1引数にエラーメッセージ文字列、第2引数にエラーコードとして整数値(この例では 404)を設定しています。
try...catch 構文の catch ブロックでこの例外を捕捉すると、例外オブジェクトから情報を取り出せます。$e->getCode() は、例外発生時に設定されたエラーコードを取得するためのメソッドです。このメソッドに引数はなく、戻り値として整数(int)型のエラーコードが返されます。これにより、エラーメッセージだけでなく、プログラムで処理しやすい数値コードを用いて、より詳細なエラーハンドリングが可能になります。実行例では、存在しないインデックス 5 を指定した際に、設定したエラーメッセージとエラーコード 404 が表示されることを確認できます。
getCode()メソッドは、例外発生時に設定された整数値(エラーコード)を取得します。このコードは、new OutOfRangeException()の第2引数で指定し、省略した場合は0が返されます。サンプルコードではHTTPの404エラーを模倣していますが、エラーの種類を識別するための任意の数値を設定できます。OutOfRangeExceptionは、配列の範囲外など不正なインデックスが指定された際に、開発者が意図的にエラーを発生(throw)させる場面で利用されます。try...catch構文で例外を捕捉しないとプログラムが停止してしまうため、エラーが発生しうる処理はtryブロックで囲むことが重要です。
PHPで配列範囲外アクセス時のエラーコードを取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定されたインデックスの配列要素を取得します。 7 * 8 * このコードは PHP の推奨コーディングスタイル (PSR-12) に準拠しており、 9 * PHP CodeSniffer (phpcs) などの静的解析ツールで検証されることを想定しています。 10 * 11 * @param array<int, mixed> $data データ配列 12 * @param int $index 取得したい要素のインデックス 13 * @return mixed 配列の要素 14 * @throws OutOfRangeException インデックスが配列の範囲外の場合にスローされる 15 */ 16function getElement(array $data, int $index): mixed 17{ 18 if (!array_key_exists($index, $data)) { 19 // 配列の範囲外アクセスの場合、OutOfRangeException をスローします。 20 // 第2引数には、エラーを識別するための整数コード (code) を設定できます。 21 throw new OutOfRangeException('インデックスが範囲外です。', 404); 22 } 23 return $data[$index]; 24} 25 26// 検証用のデータ 27$items = ['apple', 'banana', 'cherry']; 28$targetIndex = 5; // 範囲外のインデックス 29 30try { 31 // 例外が発生する可能性のあるコードを実行 32 $item = getElement($items, $targetIndex); 33 echo "取得した要素: " . $item . PHP_EOL; 34} catch (OutOfRangeException $e) { 35 // OutOfRangeException を捕捉した場合の処理 36 echo "エラー: " . $e->getMessage() . PHP_EOL; 37 38 // Exception クラスから継承された `code` プロパティの値を取得します。 39 // このプロパティは、例外に設定された整数コードを返します。 40 $errorCode = $e->getCode(); 41 echo "エラーコード: " . $errorCode . PHP_EOL; 42}
PHPのOutOfRangeExceptionは、配列などで範囲外のインデックスにアクセスしようとした際に発生する、プログラムのエラー(例外)の一種です。この例外は、PHPの基本的なExceptionクラスの機能を継承しており、その一つにcodeプロパティがあります。
codeプロパティは、発生した例外を識別するための整数値を保持する役割を持ちます。これにより、同じ種類の例外であっても、原因に応じて異なるエラーコードを割り当てて細かく分類することが可能になります。
サンプルコードのgetElement関数では、インデックスが範囲外だった場合にnew OutOfRangeException('メッセージ', 404)という形で例外を生成(スロー)しています。この第二引数に指定された404が、エラーコードとしてcodeプロパティに設定されます。
try...catch構文でこの例外を捕捉した後、$e->getCode()メソッドを呼び出すことで、設定されたエラーコード404を取得できます。getCode()メソッドに引数はなく、戻り値は例外生成時に設定された整数(int型)です。この仕組みにより、エラーコードの値に応じた分岐処理などを実装できます。なお、このコードはPHP CodeSnifferなどのツールで検証されることを想定した、標準的なスタイルで記述されています。
例外には、人間向けのエラーメッセージだけでなく、プログラムがエラーの種類を機械的に識別するための整数「エラーコード」を設定できます。例外を throw する際、new OutOfRangeException('メッセージ', 404) のようにコンストラクタの第二引数でコードを指定します。この引数を省略した場合、コードは 0 になります。catch ブロックでは $e->getCode() メソッドでこのコードを取得し、その値によって処理を分岐させることが可能です。例えば、エラーコードに応じてログのレベルを変えたり、ユーザーへの表示内容を切り替えたりするなど、詳細なエラーハンドリングを実現するために利用されます。