【PHP8.x】RuntimeException::codeプロパティの使い方
codeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
codeプロパティは、RuntimeExceptionオブジェクトが保持する例外コードを保持するプロパティです。このプロパティは、基底クラスであるExceptionクラスから継承されたものであり、プログラム実行時に発生したエラーの種類を数値で識別するために使用されます。開発者は、例外を発生させる際に、エラーメッセージと共にこの整数コードを指定することができます。主な目的は、catchブロック内で例外を捕捉した際に、エラーメッセージの文字列内容を解析することなく、コードの値によって処理を分岐させることです。例えば、同じRuntimeExceptionでも、データベース接続エラーにはコード100、ファイル書き込みエラーにはコード200を割り当てることで、コードに応じた具体的な復旧処理やログ出力を行うことが可能になります。この値は、RuntimeExceptionのインスタンスを生成する際のコンストラクタ第2引数で設定し、getCode()メソッドを通じて取得します。指定されなかった場合のデフォルト値は0です。このように、codeプロパティは、より構造化された堅牢なエラーハンドリングを実現するために重要な役割を果たします。
構文(syntax)
1<?php 2 3try { 4 // エラーコード 100 を指定して RuntimeException をスローする 5 throw new RuntimeException("何らかの実行時エラーが発生しました。", 100); 6} catch (RuntimeException $e) { 7 // 捕捉した例外の code プロパティの値を取得する 8 $errorCode = $e->getCode(); 9 echo "エラーコード: " . $errorCode; // 出力: エラーコード: 100 10} 11 12?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int|string
RuntimeException クラスの code プロパティは、例外に関連付けられたエラーコードを返します。このコードは integer 型または string 型のいずれかです。
サンプルコード
PHP RuntimeExceptionのcodeでHTTPステータスを管理する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * CodeIgniterのコントローラーを模したクラス 7 * RuntimeExceptionのcodeプロパティを利用して、HTTPステータスコードを管理します。 8 */ 9class UserController 10{ 11 /** 12 * ユーザー情報を取得するメソッド(ダミー) 13 * 14 * @param int $userId ユーザーID 15 * @return array<string, mixed> ユーザー情報 16 * @throws RuntimeException ユーザーが見つからない場合に例外をスローする 17 */ 18 private function findUserById(int $userId): array 19 { 20 // データベースからユーザーを探す処理をシミュレート 21 // この例では、IDが100のユーザーは存在しないと仮定します。 22 if ($userId !== 100) { 23 return ['id' => $userId, 'name' => 'John Doe']; 24 } 25 26 // ユーザーが見つからない場合、RuntimeExceptionをスローします。 27 // 第2引数にエラーコード(ここではHTTPステータスコード404)を指定します。 28 throw new RuntimeException('指定されたユーザーが見つかりません。', 404); 29 } 30 31 /** 32 * ユーザー情報を表示するエントリーポイント 33 * 34 * @param int $userId ユーザーID 35 */ 36 public function show(int $userId): void 37 { 38 // ヘッダーを設定して、出力がJSONであることを示します。 39 header('Content-Type: application/json'); 40 41 try { 42 // ユーザー情報を取得しようと試みます。 43 $user = $this->findUserById($userId); 44 45 // 成功した場合、HTTPステータス200(OK)を設定し、ユーザー情報をJSONで返します。 46 http_response_code(200); 47 echo json_encode(['status' => 'success', 'data' => $user]); 48 } catch (RuntimeException $e) { 49 // RuntimeExceptionがキャッチされた場合(ユーザーが見つからなかった場合) 50 // getCode()メソッドで例外に設定されたコードを取得します。 51 $errorCode = $e->getCode(); 52 53 // 取得したコードをHTTPステータスコードとして設定します。 54 http_response_code($errorCode); 55 56 // エラー情報をJSON形式で出力します。 57 echo json_encode([ 58 'status' => 'error', 59 'code' => $errorCode, // 例外コード 60 'message' => $e->getMessage() // 例外メッセージ 61 ]); 62 } 63 } 64} 65 66// --- 実行コード --- 67 68$controller = new UserController(); 69 70// 存在するユーザーID(1)で実行 71echo "--- ユーザーID: 1 の場合 ---" . PHP_EOL; 72$controller->show(1); 73echo PHP_EOL . PHP_EOL; 74 75// 存在しないユーザーID(100)で実行 76echo "--- ユーザーID: 100 の場合 ---" . PHP_EOL; 77$controller->show(100); 78echo PHP_EOL; 79 80/* 81 * --- 実行結果(コマンドラインで実行した場合) --- 82 * 83 * --- ユーザーID: 1 の場合 --- 84 * {"status":"success","data":{"id":1,"name":"John Doe"}} 85 * 86 * --- ユーザーID: 100 の場合 --- 87 * {"status":"error","code":404,"message":"指定されたユーザーが見つかりません。"} 88 * 89 * ※ Webサーバー経由でアクセスした場合、HTTPレスポンスコードもそれぞれ200と404に設定されます。 90 */
このPHPサンプルコードは、WebアプリケーションフレームワークのCodeIgniterでよく用いられるエラー処理を模しており、RuntimeException の code プロパティを使ってHTTPステータスコードを管理する方法を示しています。
findUserById メソッドは、ユーザーが見つからない場合に RuntimeException をスローします。その際、コンストラクタの第2引数に 404 というエラーコードを指定しています。この指定した数値が、RuntimeException オブジェクトの code プロパティに格納されます。code プロパティは、例外に関する追加情報として整数または文字列のコードを保持する役割を持ちます。
show メソッド内の try...catch ブロックでは、この例外を捕捉します。catch ブロックで実行される $e->getCode() メソッドは、例外オブジェクトが持つ code プロパティの値を返します。このメソッドに引数はなく、戻り値はスロー時に設定されたコード、この例では 404 となります。取得したコードは http_response_code() 関数に渡され、クライアントへのHTTPレスポンスステータスとして設定されます。このように code プロパティと getCode() メソッドを利用することで、エラーメッセージと共に機械的に処理可能なエラーコードを渡し、より柔軟なエラーハンドリングを実現できます。
RuntimeExceptionをthrowする際、第2引数にエラーコードを指定できます。このサンプルでは、ユーザーが見つからない場合にHTTPステータスコードである404をエラーコードとして設定しています。try...catchブロックで例外を捕捉した後、$e->getCode()メソッドでこのコードを取得し、http_response_code()関数に渡すことで、実際のHTTPレスポンスに反映させています。このように例外のcodeプロパティを活用すると、エラーの種類に応じたHTTPステータスを動的に制御できるため、API開発などで非常に役立ちます。この方法はCodeIgniterに限らず、多くのPHPアプリケーションで応用できる実践的なテクニックです。
RuntimeException の code プロパティでエラーを識別する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * ファイルを検証し、問題がある場合にエラーコード付きの例外をスローするクラス。 7 * 8 * このサンプルは、PHP CodeSnifferのようなツールがファイルを静的解析する際に、 9 * 解析不能な状態(ファイルが存在しないなど)をどのように扱うかという概念を模倣しています。 10 * RuntimeExceptionの第2引数に指定した 'code' は、エラーの種類を識別するために利用できます。 11 */ 12class FileValidator 13{ 14 // ファイルが見つからない場合のエラーコード 15 public const ERROR_CODE_NOT_FOUND = 10; 16 17 // ファイルが空である場合のエラーコード 18 public const ERROR_CODE_IS_EMPTY = 20; 19 20 /** 21 * 指定されたファイルの妥当性を検証します。 22 * 23 * @param string $filePath 検証するファイルのパス 24 * @throws RuntimeException ファイルが存在しないか、空の場合 25 */ 26 public function validate(string $filePath): void 27 { 28 if (!file_exists($filePath)) { 29 // ファイルが存在しない場合、エラーコードを付けて例外をスロー 30 throw new RuntimeException( 31 "ファイルが見つかりません: {$filePath}", 32 self::ERROR_CODE_NOT_FOUND 33 ); 34 } 35 36 if (filesize($filePath) === 0) { 37 // ファイルが空の場合、エラーコードを付けて例外をスロー 38 throw new RuntimeException( 39 "ファイルが空です: {$filePath}", 40 self::ERROR_CODE_IS_EMPTY 41 ); 42 } 43 44 echo "ファイル '{$filePath}' の検証に成功しました。" . PHP_EOL; 45 } 46} 47 48$validator = new FileValidator(); 49 50// --- ケース1: 存在しないファイルで例外を発生させる --- 51try { 52 $validator->validate('non_existent_file.txt'); 53} catch (RuntimeException $e) { 54 // catchした例外のメッセージとコードを取得して表示 55 echo '--- 例外をキャッチしました ---' . PHP_EOL; 56 echo 'エラーメッセージ: ' . $e->getMessage() . PHP_EOL; 57 echo 'エラーコード: ' . $e->getCode() . PHP_EOL; 58 echo PHP_EOL; 59} 60 61// --- ケース2: 空のファイルで例外を発生させる --- 62$emptyFile = 'empty.txt'; 63// テスト用に空のファイルを作成 64file_put_contents($emptyFile, ''); 65 66try { 67 $validator->validate($emptyFile); 68} catch (RuntimeException $e) { 69 echo '--- 例外をキャッチしました ---' . PHP_EOL; 70 echo 'エラーメッセージ: ' . $e->getMessage() . PHP_EOL; 71 echo 'エラーコード: ' . $e->getCode() . PHP_EOL; 72 echo PHP_EOL; 73} finally { 74 // テスト用に作成したファイルを削除 75 unlink($emptyFile); 76} 77 78// --- ケース3: 正常なファイル --- 79$validFile = 'valid.txt'; 80file_put_contents($validFile, 'This is a valid file.'); 81 82try { 83 $validator->validate($validFile); 84} catch (RuntimeException $e) { 85 // このブロックは実行されないはず 86 echo '--- 例外をキャッチしました ---' . PHP_EOL; 87 echo 'エラーメッセージ: ' . $e->getMessage() . PHP_EOL; 88 echo 'エラーコード: ' . $e->getCode() . PHP_EOL; 89} finally { 90 unlink($validFile); 91}
このサンプルコードは、例外クラス RuntimeException に付随するエラーコードを扱う code プロパティの使用方法を示しています。この code プロパティは、発生した例外の種類をプログラムで識別するための数値や文字列を格納するものです。
FileValidator クラスは、ファイルの検証に失敗した場合に RuntimeException を発生させます。例外を生成する際、new RuntimeException("メッセージ", エラーコード) のように第2引数へ独自に定義したエラーコード(10 や 20)を指定しています。これにより、特定のエラー状況に対応するコードを例外に紐づけることができます。
try-catch ブロックでは、発生した例外を捕捉します。catch 節で受け取った例外オブジェクト $e の getCode() メソッドを呼び出すと、例外に設定されたエラーコードが取得できます。この getCode() メソッドは引数を取らず、戻り値として例外生成時に指定されたエラーコード(この例では整数)を返します。
このようにエラーコードを活用することで、エラーメッセージの文字列に頼ることなく、コードの値に基づいてエラーの種類を機械的に判別し、それぞれの状況に応じた適切な処理を実装することが可能になります。
例外を扱う際、エラーメッセージだけでなくgetCode()で取得できるエラーコードの活用が重要です。エラーメッセージは人間が読むための情報であり、プログラムでエラーの種類に応じて処理を分岐させたい場合は、エラーコードを用いるのが一般的です。サンプルコードのように、エラーコードをconstで定数として定義すると、コードが読みやすく、管理も容易になります。例外はtry...catchで捕捉しないとプログラムが停止してしまいますが、捕捉することでエラーに応じた適切な処理を安全に続けられます。また、finallyブロックは例外の有無にかかわらず必ず実行されるため、ファイルの削除といった後処理を記述するのに適しています。