【PHP8.x】RangeException::codeプロパティの使い方
codeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
codeプロパティは、例外に関連付けられた整数型のエラーコードを保持するプロパティです。このプロパティはRangeExceptionクラスが独自に定義しているものではなく、PHPの全ての例外クラスの親であるExceptionクラスから継承されたものです。開発者は、RangeExceptionのインスタンスを生成する際に、コンストラクタの第二引数として任意のエラーコードを渡すことができます。これにより、同じ種類の例外であっても、発生した具体的な原因に応じて異なる数値を割り当てることが可能になります。例えば、値が範囲の下限を下回った場合と上限を上回った場合とで、それぞれ別のエラーコードを設定する、といった使い方ができます。例外を捕捉する側のコードでは、getCode()メソッドを用いてこのエラーコードを取得し、その値に基づいて処理を分岐させることができます。エラーコードが明示的に指定されなかった場合、このプロパティのデフォルト値は0となります。この仕組みは、エラーメッセージの文字列内容に依存しない、より安定的で明確なエラーハンドリングを実現するために役立ちます。
構文(syntax)
1<?php 2 3try { 4 // 例外コード 404 を指定して RangeException をスローします 5 throw new RangeException("指定されたインデックスは範囲外です。", 404); 6} catch (RangeException $e) { 7 // 捕捉した例外インスタンスから、コンストラクタで設定された例外コードを取得します 8 $exceptionCode = $e->getCode(); 9 echo $exceptionCode; // 404 10} 11 12?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
このプロパティは、例外が発生した際に付随するエラーコードを整数型で返します。
サンプルコード
PHP CodeIgniter風 RangeException の活用
1<?php 2 3declare(strict_types=1); 4 5// CodeIgniterフレームワークで使われるような、カスタムエラーコードを定数で定義します 6define('ERROR_INVALID_PAGINATION', 4001); 7 8/** 9 * CodeIgniterのコントローラを模した、記事一覧のページネーションを扱うクラスです。 10 * 11 * このクラスは、無効なページ番号が指定された場合に RangeException を使用する方法を示します。 12 */ 13class ArticleController 14{ 15 /** 16 * 指定されたページの記事一覧を表示します。 17 * 18 * ページ番号が有効な範囲(1以上)にない場合、RangeExceptionをスローします。 19 * この例外には、エラーの原因をプログラムで識別するためのカスタムエラーコードが含まれます。 20 * 21 * @param int $page 表示する記事一覧のページ番号 22 * @return string 処理結果を示すメッセージ 23 * @throws RangeException ページ番号が1未満の場合 24 */ 25 public function showPage(int $page): string 26 { 27 // ページ番号が1未満の場合は、有効な範囲外として扱います 28 if ($page < 1) { 29 // 値が有効範囲外であることを示す RangeException をスローします。 30 // 第1引数: エラーメッセージ 31 // 第2引数: エラーコード(例外の `code` プロパティに格納されます) 32 throw new RangeException( 33 'ページ番号には1以上の整数を指定してください。', 34 ERROR_INVALID_PAGINATION 35 ); 36 } 37 38 // 実際にはここでモデルを呼び出し、データベースから記事データを取得します 39 return "記事一覧の {$page} ページ目を表示します。"; 40 } 41} 42 43// --- 以下は、このコントローラクラスを実際に利用するコードです --- 44 45$controller = new ArticleController(); 46// テスト用のページ番号リスト(正常な値と異常な値を含む) 47$testPages = [3, 1, 0, 5, -10]; 48 49foreach ($testPages as $page) { 50 echo "--- ページ番号 '{$page}' の表示を試行 ---" . PHP_EOL; 51 52 try { 53 // コントローラのメソッドを呼び出します 54 $response = $controller->showPage($page); 55 echo "成功: " . $response . PHP_EOL; 56 } catch (RangeException $e) { 57 // RangeException がスローされた場合の処理をここに記述します 58 echo "エラー: " . $e->getMessage() . PHP_EOL; 59 60 // getCode() メソッドを使って、例外に設定されたエラーコードを取得します。 61 // このコードを元に、ログ出力のレベルを変えたり、ユーザーへの表示を切り替えたりできます。 62 $errorCode = $e->getCode(); 63 echo "エラーコード: " . $errorCode . PHP_EOL; 64 65 // エラーコードに基づいて処理を分岐する例 66 if ($errorCode === ERROR_INVALID_PAGINATION) { 67 // 例えば、このエラーコードの場合は404 Not Foundページを表示するなどの処理に繋げられます 68 echo "-> 無効なページ番号のため、処理を中断しました。" . PHP_EOL; 69 } 70 } finally { 71 echo PHP_EOL; 72 } 73}
このPHPサンプルコードは、例外クラス RangeException の code プロパティを使用して、エラーの種類を識別する方法を示しています。CodeIgniterのようなWebフレームワークで、無効なページ番号が指定された場合のエラー処理を想定しています。
ArticleController クラスの showPage メソッドは、1未満のページ番号が渡されると RangeException を発生させます。例外を生成する際、第1引数にエラーメッセージ、第2引数に「エラーコード」となる整数(この例では定数 ERROR_INVALID_PAGINATION)を指定します。この指定したエラーコードが、例外オブジェクトの code プロパティに格納されます。
try...catch ブロックで例外を捕捉した後、$e->getCode() メソッドを使って code プロパティの値を取得します。getCode() メソッドは引数を取らず、戻り値として設定された整数 (int) 型のエラーコードを返します。このエラーコードを判定することで、エラーメッセージの文字列に頼らずにエラーの種類を正確に識別し、「無効なページ番号」のような特定のエラーに応じた処理を確実に行うことができます。このように code プロパティは、より信頼性の高いエラーハンドリングを実装するために役立ちます。
Exceptionが持つcodeプロパティは、エラーの種類をプログラムで識別するための整数値です。これは人間が読むためのエラーメッセージとは役割が異なります。値は、例外をnewする際の第2引数で設定し、catchブロック内で$e->getCode()メソッドを使って取得します。このエラーコードを利用することで、if文やswitch文で処理を分岐させ、エラーの種類に応じたログ出力やユーザー通知といった、より丁寧なエラーハンドリングを実装できます。コードを指定しない場合のデフォルト値は0です。エラーコードを独自に定義し活用することで、より堅牢なシステムを構築できます。
Range, Exception, Codeを扱うPHPコード
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定された数値が有効な範囲内にあるか検証し、範囲外の場合は例外をスローします。 7 * このコードはPHPの推奨コーディングスタイル(PSR-12)に準拠しています。 8 */ 9final class RangeValidator 10{ 11 private const MIN_VALUE = 0; 12 private const MAX_VALUE = 100; 13 14 // エラーコードを定数として定義しておくと管理しやすくなります。 15 private const ERROR_CODE_TOO_LOW = 1001; 16 private const ERROR_CODE_TOO_HIGH = 1002; 17 18 /** 19 * 数値が0から100の範囲内にあるか検証します。 20 * 21 * @param int $value 検証する数値 22 * 23 * @return void 24 * 25 * @throws RangeException 値が有効範囲外の場合 26 */ 27 public function validate(int $value): void 28 { 29 if ($value < self::MIN_VALUE) { 30 // 値が範囲外の場合、RangeExceptionをスローします。 31 // 第2引数で、整数型の例外コード(code)を指定できます。 32 throw new RangeException( 33 '値が小さすぎます。', 34 self::ERROR_CODE_TOO_LOW 35 ); 36 } 37 38 if ($value > self::MAX_VALUE) { 39 // 値が範囲外の場合、RangeExceptionをスローします。 40 throw new RangeException( 41 '値が大きすぎます。', 42 self::ERROR_CODE_TOO_HIGH 43 ); 44 } 45 46 echo "値 '{$value}' は有効な範囲内です。" . PHP_EOL; 47 } 48} 49 50$validator = new RangeValidator(); 51 52try { 53 // tryブロック内で、例外が発生する可能性のあるコードを実行します。 54 $validator->validate(50); // これは成功します。 55 $validator->validate(200); // ここで例外がスローされます。 56 $validator->validate(-10); // この行は実行されません。 57} catch (RangeException $e) { 58 // catchブロックで、スローされたRangeExceptionオブジェクトを捕捉します。 59 echo '--------------------' . PHP_EOL; 60 echo '例外を捕捉しました。' . PHP_EOL; 61 62 // getCode() メソッドで、スロー時に設定した例外コードを取得します。 63 // このプロパティの型は int です。 64 $code = $e->getCode(); 65 66 echo "エラーコード: " . $code . PHP_EOL; 67 echo "メッセージ: " . $e->getMessage() . PHP_EOL; 68 echo '--------------------' . PHP_EOL; 69}
このPHPサンプルコードは、例外処理におけるRangeExceptionのcodeプロパティの利用方法を示しています。codeプロパティは、例外の種類をより細かく分類するための整数値を保持します。
RangeValidatorクラスは、数値が指定範囲内か検証します。範囲外の場合、throwキーワードを使ってRangeExceptionを発生させます。RangeExceptionのコンストラクタでは、第1引数にエラーメッセージ、第2引数に整数型の例外コード(code)を設定できます。この例では、値が小さすぎる場合に1001、大きすぎる場合に1002という独自のコードを指定しています。
try...catch構文により、例外発生の可能性がある処理を安全に実行します。validate(200)が呼び出されるとRangeExceptionがスローされ、処理はcatchブロックに移ります。catchブロックでは、捕捉した例外オブジェクトのgetCode()メソッドを呼び出します。このメソッドは引数を取らず、例外発生時に設定されたcodeプロパティの値をint型で返します。
このようにcodeプロパティとgetCode()メソッドを利用することで、エラーメッセージの文字列に依存せず、数値によってエラーの種類を正確に識別し、コードに応じた分岐処理などを実装できます。
例外の code プロパティは、エラーの種類を整数で識別するためのものです。getCode() メソッドで取得でき、コンストラクタで指定しない場合の既定値は 0 です。エラーメッセージの文字列で判定するよりも、このエラーコードで処理を分岐させる方が、将来メッセージが変更された場合でも影響を受けにくく堅牢です。サンプルコードのように、エラーコードを定数として定義しておくと、コードの可読性が向上し管理が容易になります。例外を throw する可能性のある処理は、プログラムの異常終了を防ぐため、必ず try...catch ブロックで囲んで適切に処理してください。また、PHP CodeSnifferなどの静的解析ツールは、定められたコーディング規約に沿っているかを確認し、コードの品質を保つのに役立ちます。