【PHP8.x】LengthException::getPrevious()メソッドの使い方
getPreviousメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『getPreviousメソッドは、連鎖された例外における直前の例外を取得するメソッドです』
このメソッドは、PHPの例外処理機能の一部である「例外チェーン」を実現するために使用されます。例外チェーンとは、ある例外が別の例外を原因として発生した場合に、その因果関係を保持する仕組みのことです。LengthExceptionクラスは、PHPの基本的なExceptionクラスを継承しており、このgetPreviousメソッドもExceptionクラスから継承されたものです。そのため、LengthExceptionだけでなく、他の多くの標準例外クラスでも同様に利用できます。例外をスローする際、コンストラクタの第3引数に原因となった例外オブジェクトを渡すことで、例外同士を関連付けることができます。そして、catchした例外オブジェクトに対してgetPreviousメソッドを呼び出すと、この関連付けられた先行の例外オブジェクトが返されます。先行する例外が存在しない場合はnullを返します。この機能により、エラー発生時の根本原因を追跡しやすくなり、デバッグ作業の効率化に貢献します。
構文(syntax)
1final public function getPrevious(): ?Throwable
引数(parameters)
引数なし
引数はありません
戻り値(return)
?Throwable
このメソッドは、例外の連鎖において、この例外の前に発生した例外オブジェクト、または null を返します。
サンプルコード
PHP LengthException の getPrevious() で例外を追跡する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 文字列の長さをチェックする関数。 7 * 内部で発生した例外を、より具体的なLengthExceptionでラップ(連鎖)する例です。 8 * 9 * @param mixed $value 長さをチェックする値 10 * @throws LengthException 値の長さチェックに失敗した場合 11 */ 12function checkStringLength(mixed $value): void 13{ 14 try { 15 // 本来の処理の前に、内部的な型チェックを行うと仮定します 16 if (!is_string($value)) { 17 // 予期せぬ型が渡されたため、内部的なエラーとしてInvalidArgumentExceptionをスローします 18 throw new InvalidArgumentException('入力は文字列である必要があります。'); 19 } 20 21 // 型が正しければ、本来の長さチェックを実行します 22 if (mb_strlen($value) < 8) { 23 throw new LengthException('文字列は8文字以上である必要があります。'); 24 } 25 26 echo '文字列は有効です。' . PHP_EOL; 27 28 } catch (InvalidArgumentException $e) { 29 // 内部で発生した InvalidArgumentException を捕捉します。 30 // そして、それを「原因」として、より具体的な LengthException をスローします。 31 // このように例外を連鎖させるには、第3引数に元の例外 ($e) を渡します。 32 throw new LengthException('文字列の長さチェック処理に失敗しました。', 0, $e); 33 } 34} 35 36// --- メインの実行コード --- 37 38try { 39 // 不正な型(整数)を渡して、意図的に例外を発生させます 40 checkStringLength(12345); 41} catch (LengthException $e) { 42 // スローされた LengthException を捕捉します 43 echo 'エラー: ' . $e->getMessage() . PHP_EOL; 44 echo '例外クラス: ' . get_class($e) . PHP_EOL; 45 echo '---' . PHP_EOL; 46 47 // getPrevious() メソッドで、この例外の原因となった「直前の例外」を取得します 48 $previousException = $e->getPrevious(); 49 50 // 直前の例外が存在する場合、その情報を表示します 51 if ($previousException instanceof Throwable) { 52 echo '原因となったエラー: ' . $previousException->getMessage() . PHP_EOL; 53 echo '原因の例外クラス: ' . get_class($previousException) . PHP_EOL; 54 } else { 55 echo 'この例外に先行する原因はありません。' . PHP_EOL; 56 } 57}
LengthExceptionクラスのgetPreviousメソッドは、例外が連鎖している場合に、その原因となった直前の例外を取得するために使用します。
このメソッドは引数を必要としません。戻り値は、原因となった直前の例外オブジェクト、または原因となる例外が存在しない場合はnullです。例外オブジェクトはThrowableインターフェースを実装しています。
サンプルコードでは、まずcheckStringLength関数が内部的なエラーとしてInvalidArgumentExceptionを発生させます。次にcatchブロックでこの例外を捕捉し、それを原因として新しいLengthExceptionをスローしています。このとき、コンストラクタの第3引数に元の例外を渡すことで「例外の連鎖」が作られます。
メイン処理では、最終的にスローされたLengthExceptionをcatchで受け取ります。そして、そのオブジェクトに対してgetPrevious()メソッドを呼び出すことで、連鎖の元となったInvalidArgumentExceptionの情報を取得しています。これにより、ユーザーに見せるエラーとは別に、開発者はデバッグのために根本原因を調査できます。
getPrevious()メソッドは、例外が別の例外を原因として発生した場合に、その原因となった「元の例外」を取得するために使います。これを「例外の連鎖」と呼びます。例外を連鎖させるには、新しい例外を生成する際に、コンストラクタの第3引数に原因となった例外オブジェクトを渡します。getPrevious()メソッドは、原因となる例外が存在しない場合はnullを返す点に注意が必要です。そのため、このメソッドの戻り値を利用する前には、必ずif文などでnullでないことを確認してください。この仕組みを使うことで、表面的なエラーだけでなく、その根本原因まで追跡できるため、デバッグが非常に容易になります。