【PHP8.x】OverflowException::codeプロパティの使い方
codeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『code』プロパティは、スローされた例外のエラーコードを保持するプロパティです。このプロパティには通常、例外の種類をプログラム的に識別するための整数値が格納されます。例外メッセージが主に開発者がデバッグのために読む情報であるのに対し、このエラーコードはプログラムコード内でエラーの種類に応じた処理を分岐させるために利用されます。例えば、try-catchブロック内で捕捉した例外オブジェクトのgetCode()メソッドを使い、返されたコード値によって異なるエラーハンドリングを実行するといった使い方が可能です。OverflowExceptionは、データ構造が満杯の状態で要素を追加しようとした場合などに発生する例外ですが、この例外をスローする際に、コンストラクタの第2引数として任意のエラーコードを渡すことで、このプロパティに値を設定できます。これにより、同じ種類の例外であっても、発生した状況をコードで細かく分類し、より的確なエラー処理を実装できます。このcodeプロパティは、基底クラスであるExceptionクラスで定義されており、OverflowExceptionを含む多くの例外クラスに継承されています。もしエラーコードが明示的に指定されなかった場合、このプロパティの既定値は0となります。
構文(syntax)
1<?php 2 3try { 4 // 第2引数に整数値で例外コードを指定して、OverflowExceptionをスローします。 5 throw new OverflowException("何らかのオーバーフローが発生しました。", 500); 6} catch (OverflowException $e) { 7 // 継承したgetCode()メソッド、またはcodeプロパティで値を取得します。 8 $exceptionCode = $e->getCode(); 9 echo "例外コード: " . $exceptionCode; 10}
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
OverflowException クラスの code プロパティは、例外が発生した際の数値コードを表す整数値を返します。
サンプルコード
PHP OverflowException の code プロパティを CodeIgniter で使う
1<?php 2 3// CodeIgniterフレームワークの基本クラスを模したダミー定義(単体動作のため) 4namespace CodeIgniter\Controller { 5 class BaseController {} 6} 7 8namespace App\Controllers { 9 10 use CodeIgniter\Controller\BaseController; 11 use OverflowException; 12 13 /** 14 * CodeIgniterのコントローラを模したサンプルクラス 15 * 16 * 在庫管理のロジックでOverflowExceptionの`code`プロパティの使用例を示します。 17 */ 18 class ProductStock extends BaseController 19 { 20 // 在庫数の上限を定義 21 private const MAX_STOCK_CAPACITY = 10000; 22 23 // 在庫超過エラーを示す独自のエラーコード 24 private const ERROR_CODE_STOCK_OVERFLOW = 5001; 25 26 /** 27 * 指定された商品IDの在庫を更新します。 28 * 在庫が上限を超える場合、OverflowExceptionをスローします。 29 * 30 * @param int $productId 商品ID 31 * @param int $addQuantity 追加する在庫数 32 */ 33 public function update(int $productId, int $addQuantity): void 34 { 35 echo "商品ID:{$productId} の在庫追加処理を開始します。\n"; 36 echo "追加数: {$addQuantity}\n"; 37 38 try { 39 // 現在の在庫数をデータベースから取得したと仮定 40 $currentStock = 8000; 41 echo "現在の在庫: {$currentStock}\n"; 42 43 // 追加後の在庫数が上限を超えるかチェック 44 if (($currentStock + $addQuantity) > self::MAX_STOCK_CAPACITY) { 45 // 上限を超える場合はOverflowExceptionを意図的にスローします。 46 // 第2引数に独自のエラーコードを設定することで、 47 // 例外の`code`プロパティに値がセットされます。 48 throw new OverflowException( 49 "在庫数が最大許容量を超えました。", 50 self::ERROR_CODE_STOCK_OVERFLOW 51 ); 52 } 53 54 // 在庫更新処理(成功したと仮定) 55 $newStock = $currentStock + $addQuantity; 56 echo "在庫の更新に成功しました。新しい在庫数: {$newStock}\n"; 57 58 } catch (OverflowException $e) { 59 // OverflowExceptionを捕捉します。 60 61 // getCode()メソッドで、例外に設定されたエラーコードを取得します。 62 $errorCode = $e->getCode(); 63 64 // 取得したエラーコードに応じて処理を分岐させます。 65 if ($errorCode === self::ERROR_CODE_STOCK_OVERFLOW) { 66 echo "エラー: 在庫を追加できませんでした。\n"; 67 echo "理由: " . $e->getMessage() . "\n"; 68 echo "エラーコード: " . $errorCode . "\n"; 69 // ここでログ出力や管理者への通知などの処理を想定します。 70 } else { 71 echo "予期せぬオーバーフローエラーが発生しました。\n"; 72 echo "エラーコード: " . $errorCode . "\n"; 73 } 74 } finally { 75 echo "----------------------------------------\n"; 76 } 77 } 78 } 79} 80 81// --- 実行コード(CodeIgniterのルーティングの代わり) --- 82namespace { 83 use App\Controllers\ProductStock; 84 85 // コントローラのインスタンスを生成 86 $controller = new ProductStock(); 87 88 // ケース1: 正常に在庫が追加できる場合 89 $controller->update(101, 1500); 90 91 // ケース2: 在庫が上限を超えてしまい、例外が発生する場合 92 $controller->update(101, 3000); 93}
このPHPサンプルコードは、OverflowExceptionが持つcodeプロパティの使い方を解説するものです。codeプロパティは、例外に固有の整数エラーコードを保持するために使用され、エラーの具体的な原因をプログラムで識別するのに役立ちます。
このコードは、WebフレームワークCodeIgniterのコントローラを想定した在庫管理の例です。在庫を追加する処理において、もし合計在庫数がシステムで定められた上限を超えてしまう場合に、意図的にOverflowExceptionを発生させています。
例外を発生させる際、new OverflowException()の第2引数に、あらかじめ定義しておいた独自のエラーコード(ERROR_CODE_STOCK_OVERFLOW)を渡すことで、codeプロパティにその値が設定されます。
catchブロックで例外を捕捉した後、$e->getCode()メソッドでcodeプロパティの値を取得します。このメソッドは引数を取らず、戻り値として整数型(int)のエラーコードを返します。取得したコードをif文で判定することで、「在庫超過が原因のエラー」の場合に限り特定のメッセージを表示するなど、エラーの原因に応じたきめ細やかな処理分岐を実現しています。
OverflowExceptionのcodeプロパティには、new OverflowException()の第2引数で任意の整数エラーコードを設定します。指定しない場合の初期値は0です。このコードは、catchブロック内でgetCode()メソッドを使って取得します。codeプロパティは直接参照できないため注意が必要です。取得したエラーコードを条件分岐に用いることで、同じ例外クラスでも原因によって処理を振り分けることができます。サンプルコードのように、エラーコードを直接書かずに定数として定義すると、コードの意味が分かりやすくなり、管理もしやすくなります。この仕組みはCodeIgniter固有のものではなく、PHPの標準機能です。
固定長バッファでの例外処理
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 固定長のデータバッファを管理するクラス 7 * 8 * このクラスは、PHP_CodeSnifferが推奨するPSR-12コーディングスタイルに準拠しています。 9 * 型宣言、例外処理、命名規則などがスタイルガイドに従って記述されています。 10 */ 11final class FixedSizeBuffer 12{ 13 /** 14 * バッファの最大容量を示すエラーコード 15 */ 16 private const ERROR_CAPACITY_EXCEEDED = 1001; 17 18 /** 19 * @var array<int, string> データを格納する配列 20 */ 21 private array $data = []; 22 23 /** 24 * @var int 現在のデータサイズ 25 */ 26 private int $currentSize = 0; 27 28 /** 29 * コンストラクタ 30 * 31 * @param int $maxSize バッファの最大サイズ 32 */ 33 public function __construct(private readonly int $maxSize) 34 { 35 } 36 37 /** 38 * バッファにデータを追加する 39 * 40 * @param string $item 追加するデータ項目 41 * @throws OverflowException バッファの容量を超えた場合にスローされる 42 */ 43 public function add(string $item): void 44 { 45 if ($this->currentSize >= $this->maxSize) { 46 // 容量を超えた場合、メッセージとエラーコードを指定して例外をスローする 47 throw new OverflowException( 48 'Buffer capacity exceeded.', 49 self::ERROR_CAPACITY_EXCEEDED 50 ); 51 } 52 53 $this->data[] = $item; 54 $this->currentSize++; 55 } 56} 57 58// バッファのインスタンスを生成 (最大容量: 2) 59$buffer = new FixedSizeBuffer(2); 60 61try { 62 echo "Adding 'item1'..." . PHP_EOL; 63 $buffer->add('item1'); 64 65 echo "Adding 'item2'..." . PHP_EOL; 66 $buffer->add('item2'); 67 68 // この追加処理で OverflowException が発生する 69 echo "Adding 'item3'..." . PHP_EOL; 70 $buffer->add('item3'); 71} catch (OverflowException $e) { 72 // 捕捉した例外のメッセージとコードを出力する 73 echo "--------------------------" . PHP_EOL; 74 echo "Caught exception!" . PHP_EOL; 75 echo "Message: " . $e->getMessage() . PHP_EOL; 76 // Exception::getCode() を使用して例外コードを取得 77 echo "Code: " . $e->getCode() . PHP_EOL; 78 echo "--------------------------" . PHP_EOL; 79}
このPHPサンプルコードは、固定長のデータバッファがいっぱいになったときに発生するエラーの処理方法を示しており、特にOverflowExceptionクラスのcodeプロパティの役割を解説します。
FixedSizeBufferクラスは、あらかじめ決められた最大サイズを超えるデータを追加できないように設計されています。サンプルでは最大サイズを2に設定し、3つ目のデータを追加しようとすると、addメソッド内でnew OverflowException()を使って意図的に例外を発生させます。このとき、コンストラクタの第1引数にエラーメッセージ、第2引数に独自のエラーコード(この例では1001)を指定しています。このエラーコードが、生成された例外オブジェクトのcodeプロパティに整数値として格納されます。
try...catchブロックでこの例外を捕捉した後、$e->getCode()メソッドを呼び出しています。このメソッドは引数を取らず、例外オブジェクトが持つcodeプロパティの値をint型で返します。これにより、例外発生時に設定されたエラーコード1001を取得し、画面に出力できます。このように、エラーコードを用いることで、エラーメッセージの文字列に依存せず、エラーの種類を数値で正確に識別できるため、プログラムでの分岐処理などが容易になります。
なお、このコードはPHP_CodeSnifferというツールで検証されることを想定し、PSR-12という標準的なコーディング規約に従って記述されています。
このサンプルコードは、エラーが発生してもプログラムが停止しないように try...catch 構文で例外処理を行っています。catch ブロックで受け取った例外オブジェクトの getCode() メソッドは、エラーの種類を識別するための整数値(エラーコード)を返します。エラーメッセージ(getMessage())が人間向けの説明であるのに対し、エラーコードはプログラムで処理を分岐させる際に役立ちます。例えば、コードの値によってログのレベルを変えたり、ユーザーへの通知方法を変えたりできます。例外を発生させる (throw) 際には、第2引数に独自に定義したエラーコードを指定することで、より詳細なエラーハンドリングが可能になります。