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

【PHP8.x】ClosedGeneratorException::codeプロパティの使い方

codeプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

codeプロパティは、例外に関する整数コードを保持するプロパティです。このプロパティは、ClosedGeneratorExceptionクラスがPHPの基底クラスであるExceptionから継承したものです。そのため、PHPの他の多くの例外クラスと同様の役割を持ちます。主な目的は、発生した例外の原因をプログラムで識別・分類するための数値を提供することです。開発者は、try-catch構文で例外を捕捉した際に、例外メッセージの文字列で判断する代わりに、このcodeプロパティの数値によって処理を分岐させることができます。これにより、より効率的で信頼性の高いエラーハンドリングを実装することが可能になります。ClosedGeneratorExceptionは、すでに終了して閉じられたジェネレータに対して操作を行おうとした際にスローされますが、この例外がPHPの内部エンジンによって自動的にスローされた場合、codeプロパティの値は通常0に設定されます。このプロパティの値は、インスタンスのgetCode()メソッドを呼び出すことで取得できます。

構文(syntax)

1<?php
2
3$exception = new ClosedGeneratorException("Generator is closed.", 123);
4echo $exception->code;

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

このプロパティは、Generatorが閉じられた際に発生した例外のコード番号を整数値で返します。

サンプルコード

PHP: ClosedGeneratorException::code を取得する

1<?php
2
3/**
4 * ClosedGeneratorException::code のサンプル
5 *
6 * このコードは、PHPのジェネレータが既に閉じられた後に
7 * Generator::send() メソッドを呼び出そうとした際に発生する
8 * ClosedGeneratorException を捕獲し、その 'code' プロパティを表示する例です。
9 *
10 * 'code' プロパティは、例外の種類を特定するための数値コードを返します。
11 * ClosedGeneratorException の場合、通常、デフォルト値である 0 が返されます。
12 *
13 * この例は、CodeIgniterのようなフレームワークを使用するアプリケーション内で、
14 * 大量のデータ処理やストリーム処理にジェネレータが利用される場合の
15 * 例外処理の基本的な理解を助けることを目的としています。
16 */
17class GeneratorService
18{
19    /**
20     * 指定された範囲の数字を生成するジェネレータ関数。
21     * 仮想的に、データベースから大量のレコードをチャンクで取得する
22     * シナリオなどを想定できます。
23     *
24     * @param int $start 開始値
25     * @param int $end 終了値
26     * @return Generator
27     */
28    public function generateSequence(int $start, int $end): Generator
29    {
30        for ($i = $start; $i <= $end; $i++) {
31            yield $i;
32        }
33    }
34
35    /**
36     * 閉じられたジェネレータに対する操作で発生する
37     * ClosedGeneratorException をデモンストレーションします。
38     *
39     * @return void
40     */
41    public function demonstrateClosedGeneratorException(): void
42    {
43        echo "--- ジェネレータの利用と閉じられた状態の確認 ---\n";
44
45        // ジェネレータインスタンスを作成
46        $numbersGenerator = $this->generateSequence(1, 2);
47        echo "ジェネレータを生成しました。\n";
48
49        // ジェネレータを完全にイテレートして閉じます
50        foreach ($numbersGenerator as $number) {
51            echo "生成された値: " . $number . "\n";
52        }
53        echo "ジェネレータは全ての値を生成し、閉じられました。\n";
54
55        echo "\n--- 閉じられたジェネレータへの操作と例外処理 ---\n";
56
57        try {
58            // 既に閉じられたジェネレータに対して send() を呼び出すと
59            // ClosedGeneratorException が発生します。
60            echo "閉じられたジェネレータに値を送ろうと試みます (send())...\n";
61            $numbersGenerator->send('試行データ'); // ClosedGeneratorException をトリガー
62            echo "これは表示されません。\n"; // 例外が発生するため
63        } catch (ClosedGeneratorException $e) {
64            echo "ClosedGeneratorException を捕獲しました!\n";
65            echo "例外メッセージ: " . $e->getMessage() . "\n";
66            echo "ClosedGeneratorException::code の値: " . $e->getCode() . "\n";
67            // ClosedGeneratorException の 'code' プロパティは常に 0 を返します。
68            // これは、この例外が特定のアプリケーション定義エラーコードを持たない、
69            // PHP内部の標準的な例外であることを示しています。
70        } catch (Throwable $e) {
71            // その他の予期せぬ例外を捕獲
72            echo "予期せぬ例外が発生しました: " . $e->getMessage() . "\n";
73            echo "例外コード: " . $e->getCode() . "\n";
74        }
75
76        echo "\n--- 処理完了 ---\n";
77    }
78}
79
80// この GeneratorService クラスは、CodeIgniterのようなアプリケーションの
81// ライブラリやヘルパーとして利用されることを想定できます。
82$service = new GeneratorService();
83$service->demonstrateClosedGeneratorException();
84

PHPのClosedGeneratorException::codeプロパティは、ジェネレータが既に閉じられた後、Generator::send()などの操作を行おうとした際に発生するClosedGeneratorExceptionが持つ、例外の数値コードを表すプロパティです。このプロパティは引数を取らず、常にint型の値を返します。発生した例外の種類をプログラム上で識別するために利用されます。

サンプルコードでは、まずジェネレータが全ての値を生成し終えて閉じられる過程が示されています。その後、閉じられたジェネレータに対してsend()メソッドを呼び出すことでClosedGeneratorExceptionを意図的に発生させています。捕獲された例外オブジェクトからgetCode()メソッドを通じてこのプロパティにアクセスすると、戻り値として0が表示されます。これはClosedGeneratorExceptionがPHP内部で定義された標準的な例外であり、通常、特定のアプリケーション固有のエラーコードを持たないことを示しています。

CodeIgniterのようなウェブフレームワークでは、データベースからの大量データ処理やファイルストリームの読み込みなどでジェネレータが利用されることがあります。このプロパティの理解は、ジェネレータ利用時の例外処理を適切に行う上で役立ちます。

ClosedGeneratorException::codeプロパティは、特定のアプリケーション定義コードではなく、PHP内部の標準例外を示す0を常に返します。ジェネレータは、全ての値を生成し終えるか途中で閉じられると再利用できません。一度閉じられたジェネレータに対して操作を行うとこの例外が発生するため、大量データ処理でジェネレータを利用する際は、try-catchブロックでClosedGeneratorExceptionを適切に捕獲し、安全に処理することが不可欠です。CodeIgniterのようなフレームワーク環境でも同様に、ジェネレータのライフサイクルと例外処理を考慮した実装を心がけてください。

ClosedGeneratorExceptionのコードを取得する

1<?php
2
3/**
4 * Demonstrates catching a ClosedGeneratorException and accessing its code property.
5 *
6 * This function creates a simple generator, exhausts it, and then attempts to
7 * resume it, which intentionally triggers a ClosedGeneratorException.
8 * The exception is caught, and its message and code property are displayed.
9 * The code adheres to common PHP coding standards, which would typically pass
10 * checks by tools like PHP_CodeSniffer.
11 *
12 * @return int The integer code of the caught ClosedGeneratorException, which is typically 0 for this internal exception.
13 */
14function demonstrateClosedGeneratorExceptionCode(): int
15{
16    /**
17     * A simple generator that yields a single value.
18     *
19     * @return Generator
20     */
21    $simpleGenerator = function (): Generator {
22        yield 'First and only value';
23    };
24
25    $generator = $simpleGenerator();
26
27    // Consume the only value from the generator.
28    // After this loop, the generator is exhausted and effectively closed.
29    foreach ($generator as $value) {
30        echo "Generator yielded: " . $value . "\n";
31    }
32
33    // Attempting to resume a closed generator will throw a ClosedGeneratorException.
34    try {
35        echo "Attempting to resume the closed generator...\n";
36        // This line will trigger the ClosedGeneratorException because the generator is exhausted.
37        $generator->next();
38    } catch (ClosedGeneratorException $exception) {
39        echo "Caught ClosedGeneratorException!\n";
40        echo "Exception message: " . $exception->getMessage() . "\n";
41        // Access the 'code' property of the exception using the standard getCode() method.
42        echo "Exception code: " . $exception->getCode() . "\n";
43        return $exception->getCode();
44    }
45
46    // This return statement should not be reached if the exception is thrown as expected.
47    // It acts as a fallback for unexpected scenarios.
48    return -1;
49}
50
51// Execute the demonstration function.
52demonstrateClosedGeneratorExceptionCode();

このサンプルコードは、PHPのジェネレーターが閉じられた(終了した)後に操作を試みた際に発生するClosedGeneratorExceptionと、そのcodeプロパティ(例外コード)の利用方法を示しています。

まず、一つの値だけを生成するシンプルなジェネレーターを作成し、foreachループを使ってその値を完全に消費します。これにより、ジェネレーターは閉じられた状態になります。次に、閉じられたジェネレーターに対してnext()メソッドを呼び出すことで、意図的にClosedGeneratorExceptionを発生させています。

この例外はtry-catchブロックで捕捉され、例外オブジェクトのgetMessage()メソッドでメッセージを、getCode()メソッドで例外コードを取得し、表示しています。codeプロパティは、例外の種類を数値で識別するために用いられる整数値(int型)であり、ClosedGeneratorExceptionのような内部的な例外の場合、通常は0が返されます。このdemonstrateClosedGeneratorExceptionCode関数は、捕捉した例外のコードを戻り値としてint型で返します。

コード全体は、PHPの一般的なコーディング規約に沿っており、PHP_CodeSnifferのようなツールでのチェックにも適合するよう設計されています。システムエンジニアを目指す方にとって、ジェネレーターのライフサイクルと例外処理を学ぶ上で参考になるでしょう。

ジェネレータが既に終了している状態で再度操作しようとするとClosedGeneratorExceptionが発生します。この例外のcodeプロパティは通常0を返しますが、これはPHP内部の例外であり、特定の意味を持つエラーコードではない場合が多いです。そのため、codeの値に基づいて詳細な例外処理を分岐させることは推奨されません。例外コードの取得は、プロパティへの直接アクセスではなくgetCode()メソッドを使うのが一般的で安全な方法です。本コードはPHP 8以降を想定しており、実開発ではPHP_CodeSnifferのようなツールでコーディング規約を守ることが求められます。

ClosedGeneratorExceptionのcodeプロパティを処理する

1<?php
2
3/**
4 * Creates and returns a simple generator for demonstration purposes.
5 * Generators are memory-efficient functions that can pause and resume execution,
6 * yielding values one at a time.
7 *
8 * @return Generator A generator that yields two string items.
9 */
10function createMyGenerator(): Generator
11{
12    yield 'Data item 1';
13    yield 'Data item 2';
14}
15
16/**
17 * Demonstrates how to catch a ClosedGeneratorException and access its 'code' property.
18 *
19 * This function simulates a scenario where a generator is inadvertently resumed
20 * after it has already completed its iteration. This action triggers a
21 * ClosedGeneratorException, which is then caught and handled.
22 *
23 * This example adheres to recommended PHP coding standards (e.g., PSR-12),
24 * which tools like PHP_CodeSniffer would validate. For a beginner using VSCode,
25 * understanding such error handling is crucial for debugging and building robust systems.
26 */
27function handleClosedGeneratorExceptionExample(): void
28{
29    // Obtain an instance of our simple generator.
30    $myGenerator = createMyGenerator();
31
32    echo "--- Generator Processing Start ---" . PHP_EOL;
33
34    try {
35        // Iterate through the generator to consume all its values.
36        // After this loop, the generator is considered "closed" or "finished"
37        // and cannot yield any more items.
38        foreach ($myGenerator as $item) {
39            echo "Processing item: " . $item . PHP_EOL;
40        }
41
42        echo "Generator has finished iterating through all items." . PHP_EOL;
43
44        // Attempt to resume the generator after it has completed.
45        // This is the action that will intentionally trigger a ClosedGeneratorException.
46        echo "Attempting to resume a closed generator..." . PHP_EOL;
47        $myGenerator->next(); // This line throws ClosedGeneratorException
48
49    } catch (ClosedGeneratorException $e) {
50        // Catch the specific ClosedGeneratorException.
51        // For a system engineer, catching specific exceptions like this allows for
52        // precise error handling and application recovery strategies.
53
54        echo "--- Caught ClosedGeneratorException! ---" . PHP_EOL;
55        echo "Error Message: " . $e->getMessage() . PHP_EOL;
56
57        // Access the 'code' property of the exception.
58        // As per the reference information, this is a public property returning an int.
59        // For internal PHP exceptions like ClosedGeneratorException, the 'code' is often 0 by default,
60        // unless a specific non-zero code is set by PHP's internal logic for certain scenarios.
61        $exceptionCode = $e->code;
62
63        echo "Exception Code (via 'code' property): " . $exceptionCode . PHP_EOL;
64        echo "File where error occurred: " . $e->getFile() . PHP_EOL;
65        echo "Line number of error: " . $e->getLine() . PHP_EOL;
66
67        // In a real-world system, this exception code (or a specific non-zero code)
68        // could be used for:
69        // 1. Logging: Recording the error with its specific code for analysis.
70        // 2. Monitoring: Triggering alerts for system administrators.
71        // 3. Conditional Logic: Adjusting application behavior based on the error type.
72        // A beginner using VSCode would step through this `catch` block during debugging
73        // to observe the program flow and the exception details. PHP_CodeSniffer
74        // ensures this entire try-catch structure follows defined coding standards.
75
76        if ($exceptionCode === 0) {
77            echo "This is a generic generator closure error (code 0), indicating normal completion followed by invalid resume." . PHP_EOL;
78        } else {
79            echo "This is a specific generator closure error with custom code: " . $exceptionCode . PHP_EOL;
80        }
81
82    } catch (Exception $e) {
83        // This block catches any other general exceptions that might occur,
84        // providing a fallback for unexpected errors.
85        echo "--- Caught a general Exception! ---" . PHP_EOL;
86        echo "Message: " . $e->getMessage() . PHP_EOL;
87        echo "Code: " . $e->getCode() . PHP_EOL;
88    }
89
90    echo "--- Exception Handling Complete ---" . PHP_EOL;
91}
92
93// Execute the example function to demonstrate the scenario.
94handleClosedGeneratorExceptionExample();
95

このサンプルコードは、PHPのジェネレータが完了した後に再度処理を試みた際に発生するClosedGeneratorExceptionを捕捉し、その例外が持つcodeプロパティの使い方を示すものです。ジェネレータは、必要に応じて値を一つずつ生成することでメモリ効率を向上させる関数です。

コードではまずcreateMyGenerator関数で簡単なジェネレータを作成し、handleClosedGeneratorExceptionExample関数内でそのジェネレータから全ての値をforeachループで取得します。これによりジェネレータは「閉じられた」状態になります。その後、閉じられたジェネレータに対して$myGenerator->next()を呼び出すことで、意図的にClosedGeneratorExceptionを発生させます。

この例外はtry-catchブロックで捕捉され、例外オブジェクト$eからエラー情報を取得します。リファレンス情報にある$e->codeプロパティは、この例外の固有コードをint型で返します。このプロパティには引数はありません。PHPの内部例外では、通常0がデフォルト値として設定されていることが多いですが、特定の状況では異なるコードが設定される場合もあります。システムエンジニアを目指す方にとって、このcodeプロパティは、発生したエラーの種類を特定し、ログ記録や監視、さらにはアプリケーションの挙動を調整するための重要な情報源となります。VSCodeでのデバッグ時やPHP_CodeSnifferによるコーディング標準の確認と合わせて、このように例外を適切に処理するスキルは、堅牢なシステムを構築するために不可欠です。

初心者は、ジェネレータが一度最後まで実行されると「閉じられた」状態になり、それ以上値を生成できない点に注意が必要です。閉じたジェネレータを再開しようとすると、ClosedGeneratorExceptionが発生しますので、try-catch文による例外処理は必須です。この例外のcodeプロパティは整数値を返し、多くの場合0となりますが、これはエラーの種類を特定し、ログ記録やシステムの監視、条件分岐に利用できる重要な情報です。PHP_CodeSnifferのようなツールでコード規約に沿った記述を心がけ、VSCodeでデバッグしながら例外処理を学ぶことで、堅牢なシステム構築の基礎を習得できます。

PHP ClosedGeneratorException コードのチェック

1<?php
2
3/**
4 * ClosedGeneratorException の例外コード (code) の動作を示すサンプルコード。
5 *
6 * この例外は、既に閉じられたジェネレータに対して値の送信などの操作を試みた場合に発生します。
7 * 例外オブジェクトから取得できるコードは、エラーの種類を識別するために利用できます。
8 * リファレンス情報では「code」プロパティとしていますが、PHPの標準的な例外クラスでは
9 * protected プロパティであるため、通常は getCode() メソッドを通じてアクセスします。
10 *
11 * キーワード: php code checker - 実行時エラーのコードをチェックし、エラーハンドリングに役立てる。
12 */
13function demonstrateClosedGeneratorExceptionCode(): void
14{
15    // ジェネレータ関数を定義します。
16    // このジェネレータは1つの値をyieldした後、すぐに終了します。
17    $generator = (function () {
18        yield '初回データ';
19        // ここで return することで、ジェネレータは「閉じられた」状態になります。
20        // return を省略しても、yield が全て完了すれば自動的に閉じられます。
21        return;
22    })(); // ジェネレータのインスタンスを作成
23
24    echo "ジェネレータを初期化しました。\n";
25
26    // ジェネレータを一度実行し、最初の値を取得します。
27    // その後、ジェネレータは「閉じられた状態」になります。
28    echo "最初の値を取得: " . $generator->current() . "\n";
29    $generator->next(); // ジェネレータを1つ進める。この時点でジェネレータは終了(閉じられた状態)
30
31    echo "ジェネレータが閉じられた状態になったはずです。\n";
32
33    try {
34        // 閉じられたジェネレータに対して値を送信しようとすると、
35        // ClosedGeneratorException が発生します。
36        echo "閉じられたジェネレータに値を送信しようとしています...\n";
37        $generator->send('追加データ'); // ここで ClosedGeneratorException が発生
38    } catch (ClosedGeneratorException $e) {
39        // ClosedGeneratorException を捕捉し、その例外コードを取得します。
40        // PHPの標準的なExceptionクラスでは、getCode() メソッドを使用して例外コードにアクセスします。
41        $exceptionCode = $e->getCode();
42
43        echo "ClosedGeneratorException が捕捉されました。\n";
44        echo "例外メッセージ: " . $e->getMessage() . "\n";
45        echo "例外コード (e->getCode()): " . $exceptionCode . "\n";
46
47        // 初心者向け解説:
48        // この例外コード(通常は0)をチェックすることで、特定の実行時エラーの種類を識別し、
49        // プログラムの振る舞いを調整したり、適切なエラーログを出力したりすることができます。
50        // 例えば、 if ($exceptionCode === 0) { ... } のように条件分岐で利用可能です。
51    } catch (Exception $e) {
52        // ClosedGeneratorException 以外の予期せぬ例外を捕捉します。
53        echo "予期せぬ例外が捕捉されました: " . $e->getMessage() . "\n";
54        echo "例外コード: " . $e->getCode() . "\n";
55    }
56}
57
58// デモンストレーション関数を実行します。
59demonstrateClosedGeneratorExceptionCode();

このサンプルコードは、PHPのClosedGeneratorExceptionが発生した際に、その例外が持つ「コード」を取得し利用する方法を示しています。ClosedGeneratorExceptionは、既に全ての処理を終えて「閉じられた」ジェネレータ(一時停止と再開が可能な特殊な関数)に対し、再び値の送信などの操作を行おうとした場合に発生する実行時エラーです。

リファレンス情報ではcodeプロパティと記載されていますが、PHPの標準的な例外クラスでは通常getCode()メソッドを通じてこのコードにアクセスします。このメソッドは引数を取らず、例外の種類を識別するint型の数値を返します。

サンプルコードでは、最初に定義したジェネレータが最初の値を出力し終えると閉じられた状態になります。その後、閉じられたジェネレータにsend()メソッドでデータを送ろうとすると、ClosedGeneratorExceptionが発生します。try-catchブロックでこの例外を捕捉し、$e->getCode()を呼び出すことで、例外の具体的なコード(この場合は通常0)を取得しています。

取得した例外コードは、プログラム内でエラーの種類を識別し、それぞれに応じた適切なエラーハンドリング(例:ユーザーへの特定のメッセージ表示、異なるログ記録、代替処理の実行など)を行うために非常に役立ちます。php code checkerというキーワードが示す通り、このコードをチェックすることで、実行時エラーの詳細をプログラムで判断し、堅牢なシステムを構築することができます。

このサンプルコードは、閉じられたジェネレータへの操作で発生するClosedGeneratorExceptionの捕捉方法と、例外コードの取得を示しています。ClosedGeneratorExceptionは、ジェネレータが既に終了している状態で、値の送信などを試みた際に発生します。リファレンス情報にあるcodeプロパティはprotectedであるため、直接アクセスせず、必ずgetCode()メソッドを使って例外コードを取得してください。取得した例外コード(多くの場合0)は、エラーの種類を識別し、その後のプログラムの振る舞いを決定する「php code checker」として重要な役割を果たします。これにより、特定の例外状況に応じた適切なエラーハンドリングやログ出力が可能となり、システムの安定性向上に繋がります。

関連コンテンツ

関連IT用語