【PHP8.x】getPreviousメソッドの使い方

getPreviousメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

getPreviousメソッドは、FiberErrorクラスが保持する、このエラーの発生源となった直前のThrowableオブジェクトを取得するメソッドです。PHP 8.1から導入されたFiber機能は、非同期処理や協調的マルチタスクを効率的に記述するための強力な機能であり、FiberErrorはこのFiberの実行中に何らかの問題が発生した際にスローされる例外の一種です。このgetPreviousメソッドは、例外が複数連鎖して発生する「エラーチェイン」の仕組みにおいて非常に重要です。

具体的には、ある処理中に別の例外が発生し、それが原因でFiberErrorがスローされた場合、getPreviousメソッドを呼び出すことで、元となった最初の例外オブジェクトを取得することができます。これにより、FiberErrorだけではわからなかった根本的な原因を深く調査し、デバッグの効率を大幅に向上させることが可能です。例えば、データベース操作の失敗がFiber内で起こり、その結果FiberErrorが発生した場合、getPreviousを使うことで元のデータベース関連の例外情報を把握できます。メソッドが返すのは、原因となったThrowableオブジェクト、または前の例外が存在しない場合はnullです。この仕組みを理解することは、複雑なエラーの根本原因を特定し、堅牢なアプリケーションを開発するために役立ちます。

構文(syntax)

1<?php
2
3try {
4    $fiber = new Fiber(function () {});
5    
6    // 開始前のFiberに例外を投入すると、その例外を原因(previous)とする
7    // FiberErrorがスローされます。
8    $fiber->throw(new \Exception('元のエラー'));
9
10} catch (FiberError $e) {
11    // getPrevious()メソッドで、原因となった元の例外を取得します。
12    $previous = $e->getPrevious();
13    
14    // 元の例外のメッセージを出力します。
15    echo $previous->getMessage();
16}

引数(parameters)

引数なし

引数はありません

戻り値(return)

?Throwable

このメソッドは、現在の FiberError の原因となった、先行する例外オブジェクトを返します。先行する例外がない場合は、null を返します。

サンプルコード

PHP FiberErrorから元の例外を取得する

1<?php
2
3// このコードは PHP 8.1 以降で動作します。
4// Fiber クラスが PHP 8.1 で導入されたためです。
5
6/**
7 * FiberError::getPrevious() メソッドの動作を示すサンプルコードです。
8 *
9 * Fiber(ファイバー)は、PHP 8.1で導入された、中断・再開可能な実行フローです。
10 * Fiber内で捕捉されない例外が発生した場合、その例外は外部に FiberError として伝播します。
11 * FiberError::getPrevious() は、この FiberError がラップしている元の例外を取得するために使用されます。
12 */
13function demonstrateFiberErrorGetPrevious(): void
14{
15    echo "--- FiberError::getPrevious() デモンストレーション ---" . PHP_EOL;
16
17    // 意図的に例外をスローする Fiber を作成します。
18    $fiber = new Fiber(function (): void {
19        echo "Fiber が開始されました。" . PHP_EOL;
20        // ここで通常の RuntimeException をスローします。
21        // この例外は Fiber 内で捕捉されないため、外部に FiberError として伝播します。
22        throw new \RuntimeException("Fiber 内部で発生したカスタムエラーです。");
23        // この行は例外がスローされるため実行されません。
24        echo "Fiber 内部の処理が正常終了しました。" . PHP_EOL;
25    });
26
27    try {
28        echo "Fiber の実行を開始します。" . PHP_EOL;
29        // Fiber を開始します。Fiber 内部で未捕捉の例外があると、
30        // ここで FiberError がスローされます。
31        $fiber->start();
32        echo "Fiber が正常に終了しました。(通常、このメッセージは表示されません)" . PHP_EOL;
33    } catch (\FiberError $fiberError) {
34        // Fiber 内部で発生した未捕捉の例外は、外部では FiberError として捕捉されます。
35        echo "\n--- FiberError を捕捉しました! ---" . PHP_EOL;
36        echo "FiberError のメッセージ: " . $fiberError->getMessage() . PHP_EOL;
37        echo "FiberError が発生したファイル: " . $fiberError->getFile() . PHP_EOL;
38        echo "FiberError が発生した行: " . $fiberError->getLine() . PHP_EOL;
39
40        // getPrevious() メソッドを使用して、FiberError がラップしている元の例外を取得します。
41        $previousException = $fiberError->getPrevious();
42
43        if ($previousException !== null) {
44            echo "\n--- getPrevious() で元の例外を取得しました ---" . PHP_EOL;
45            echo "元の例外のクラス: " . get_class($previousException) . PHP_EOL;
46            echo "元の例外のメッセージ: " . $previousException->getMessage() . PHP_EOL;
47            echo "元の例外が発生したファイル: " . $previousException->getFile() . PHP_EOL;
48            echo "元の例外が発生した行: " . $previousException->getLine() . PHP_EOL;
49        } else {
50            echo "\ngetPrevious() は null を返しました (元の例外は存在しませんでした)。" . PHP_EOL;
51        }
52    } catch (\Throwable $e) {
53        // 万が一、FiberError 以外の Throwable が発生した場合に備えます。
54        echo "\n--- 予期せぬエラーを捕捉しました ---" . PHP_EOL;
55        echo "エラーの種類: " . get_class($e) . PHP_EOL;
56        echo "エラーメッセージ: " . $e->getMessage() . PHP_EOL;
57    }
58
59    echo "\n--- デモンストレーション終了 ---" . PHP_EOL;
60}
61
62// 関数を実行して、FiberError::getPrevious() の動作を確認します。
63demonstrateFiberErrorGetPrevious();

PHP 8.1以降で導入されたFiberは、プログラムの実行を一時中断・再開できる機能です。このFiberの内部で捕捉されない例外が発生した場合、その例外は外部にFiberErrorという特殊な例外として伝播します。

FiberError::getPrevious()メソッドは、このFiberErrorが内部にラップしている元の例外(Fiber内で実際に発生した例外)を取得するために使用されます。このメソッドは引数を一切取りません。戻り値は?Throwable型で、元の例外が存在すればそのThrowableオブジェクトを返し、存在しない場合はnullを返します。

サンプルコードでは、Fiberの内部で意図的にRuntimeExceptionをスローしています。この例外はFiber内で捕捉されないため、Fiberstart()メソッドを呼び出した際に外側でFiberErrorとして捕捉されます。捕捉されたFiberErrorオブジェクトに対してgetPrevious()メソッドを呼び出すことで、Fiber内部でスローされたRuntimeExceptionのインスタンスを正確に取得し、そのメッセージや発生元などの詳細を確認できることが示されています。これにより、Fiber関連のエラー発生時の原因究明やデバッグが容易になります。

このコードはPHP 8.1以降で動作します。Fiberは中断・再開可能な実行フローであり、その中で未捕捉の例外が発生した場合、外部ではFiberErrorとして捕捉されます。FiberError::getPrevious()メソッドは、このFiberErrorがラップしている「元の例外」を取得するために使用されます。戻り値はnullの可能性があるため、取得した値は必ずnullチェックを行い、元の例外が存在するか確認してから利用してください。これにより、Fiber内部で発生した具体的なエラー原因を正確に特定し、適切なエラー処理を実装できます。

【PHP8.x】getPreviousメソッドの使い方 | いっしー@Webエンジニア