Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【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引数に元の例外を渡すことで「例外の連鎖」が作られます。

メイン処理では、最終的にスローされたLengthExceptioncatchで受け取ります。そして、そのオブジェクトに対してgetPrevious()メソッドを呼び出すことで、連鎖の元となったInvalidArgumentExceptionの情報を取得しています。これにより、ユーザーに見せるエラーとは別に、開発者はデバッグのために根本原因を調査できます。

getPrevious()メソッドは、例外が別の例外を原因として発生した場合に、その原因となった「元の例外」を取得するために使います。これを「例外の連鎖」と呼びます。例外を連鎖させるには、新しい例外を生成する際に、コンストラクタの第3引数に原因となった例外オブジェクトを渡します。getPrevious()メソッドは、原因となる例外が存在しない場合はnullを返す点に注意が必要です。そのため、このメソッドの戻り値を利用する前には、必ずif文などでnullでないことを確認してください。この仕組みを使うことで、表面的なエラーだけでなく、その根本原因まで追跡できるため、デバッグが非常に容易になります。

関連コンテンツ

関連プログラミング言語