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

【PHP8.x】UnderflowException::lineプロパティの使い方

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

作成日: 更新日:

基本的な使い方

『lineプロパティは、例外がスローされたソースコードの行番号を保持するプロパティです。』 このプロパティは、UnderflowExceptionクラスが直接持つものではなく、その親クラスであるExceptionクラスから継承されています。UnderflowExceptionは、例えば空の配列やスタックから要素を取り出そうとするなど、コンテナが空の状態で不正な操作が行われたときに発生する実行時例外です。この例外がスローされると、PHPエンジンは例外が発生したコードの位置を特定し、その行番号を自動的にこのlineプロパティに設定します。開発者はこの情報を利用して、プログラムのどこで問題が起きたのかを正確に把握できます。これはデバッグ作業において極めて重要な情報であり、エラーの原因究明を迅速に行う助けとなります。このプロパティはprotectedアクセス修飾子を持つため、オブジェクトの外部から直接参照することはできません。値を取得するには、公開されているgetLine()メソッドを使用する必要があります。try...catchブロックで例外を捕捉した際に、このメソッドを呼び出して行番号を取得し、ログに記録するのが一般的な使い方です。

構文(syntax)

1<?php
2try {
3    $list = new SplDoublyLinkedList();
4    $list->pop(); // この行で例外が発生
5} catch (UnderflowException $e) {
6    // 例外がスローされた行番号を取得します
7    $lineNumber = $e->getLine();
8    echo $lineNumber;
9}

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

UnderflowExceptionクラスのlineプロパティは、例外が発生したソースコードの行番号を整数で返します。

サンプルコード

PHPでUnderflowExceptionのline情報を送信する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * 空のキュー処理時に発生した例外情報(発生行を含む)を送信するデモ。
7 *
8 * この関数は、意図的に UnderflowException を発生させます。
9 * catch ブロックで例外オブジェクトを捕捉し、プロパティからエラーが発生した
10 * ファイル名や行番号(line)を取得します。
11 * 最後に、それらの情報をJSON形式で出力し、エラーログシステムへの「送信」をシミュレートします。
12 */
13function sendErrorInfoOnUnderflow(): void
14{
15    // 処理すべきタスクキュー (現在は空)
16    $taskQueue = [];
17
18    try {
19        // キューが空の場合、処理はできないため例外を発生させる
20        if (empty($taskQueue)) {
21            // この行で例外がスローされるため、この行番号が記録される
22            throw new UnderflowException('タスクキューが空です。処理を中断しました。');
23        }
24        // 本来であれば、ここでキューからタスクを取り出す処理が続く
25        // process_task(array_pop($taskQueue));
26    } catch (UnderflowException $e) {
27        // 発生した例外を捕捉し、エラー情報を構築する
28        $errorReport = [
29            'level' => 'ERROR',
30            'message' => $e->getMessage(),
31            'file' => $e->getFile(),
32            'line' => $e->getLine(), // 例外がスローされた行番号を取得
33            'timestamp' => date('c'),
34        ];
35
36        // エラー情報をJSON形式で外部システムに送信する処理をシミュレート
37        header('Content-Type: application/json; charset=utf-8');
38        echo json_encode($errorReport, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
39    }
40}
41
42// 関数を実行
43sendErrorInfoOnUnderflow();

UnderflowExceptionのような例外オブジェクトが持つgetLine()メソッドは、例外がスローされたソースコードの行番号を整数(int)で返します。このメソッドを呼び出す際に引数は必要ありません。

このサンプルコードは、タスクキューが空の状態で処理を試みた際にUnderflowExceptionを捕捉し、エラー情報を外部へ送信する処理をシミュレートします。tryブロック内では、キューが空の場合にthrow new UnderflowException(...)を実行して意図的に例外を発生させています。

catchブロックは、発生した例外オブジェクトを$eという変数で捕捉します。ここで$e->getLine()を呼び出すと、throw文が実行された行の番号が取得できます。コードでは、この行番号をgetMessage()で得られるエラーメッセージやgetFile()で得られるファイル名などの情報と合わせて、エラー報告用の連想配列を作成しています。最後に、この配列をjson_encode()でJSON形式に変換して出力することで、エラーログシステムへの情報「送信」を模倣しています。このようにgetLine()は、エラー発生箇所を正確に特定し、迅速なデバッグを行うために非常に重要な情報を提供します。

このコードの注意点は、$e->getLine()で取得される行番号が、catchブロックの行ではなく、例外がthrowされた行を指すことです。デバッグ時にこの違いを理解しておくことが重要です。また、このサンプルではechoでエラー情報を出力していますが、これはあくまで外部システムへの「送信」を模擬したものです。実際のシステムでは、ログファイルに記録したり、専門のライブラリを使ってエラー監視サービスへデータを送信したりする方法が一般的です。本番環境でファイルパスや行番号などの詳細なエラー情報をユーザーに直接表示することは、セキュリティリスクとなるため避けるべきであり、開発者のみが確認できる場所に記録してください。

PHP UnderflowException の line 連携エラー処理

1<?php
2
3declare(strict_types=1);
4
5/**
6 * 空の状態で要素を取り出そうとすると UnderflowException をスローするシンプルなスタッククラス。
7 */
8class DataProcessor
9{
10    private array $stack = [];
11
12    /**
13     * スタックから要素を1つ取り出します。
14     *
15     * @return mixed
16     * @throws UnderflowException スタックが空の場合
17     */
18    public function pop(): mixed
19    {
20        if (empty($this->stack)) {
21            // スタックが空のときに例外をスローする
22            throw new UnderflowException('データを処理できませんでした。スタックは空です。');
23        }
24        return array_pop($this->stack);
25    }
26}
27
28/**
29 * 例外処理を実行し、発生した行番号(line)と連携してエラー情報を表示する関数。
30 */
31function processData(): void
32{
33    $processor = new DataProcessor();
34
35    try {
36        // わざと空のスタックからデータを取り出し、例外を発生させる
37        $processor->pop();
38    } catch (UnderflowException $e) {
39        // 捕捉した例外オブジェクトから、発生箇所のファイル名と行番号(line)を取得
40        $fileName = $e->getFile();
41        $lineNumber = $e->getLine(); // UnderflowExceptionのlineプロパティ(継承元)にアクセス
42        $errorMessage = $e->getMessage();
43
44        // 取得した行番号($lineNumber)をエラーログ情報と連携させて出力する
45        error_log(
46            sprintf(
47                '[ERROR] ファイル "%s" の %d 行目で例外が発生しました: %s',
48                $fileName,
49                $lineNumber,
50                $errorMessage
51            )
52        );
53
54        // コンソールにも表示
55        echo "エラーが発生しました。詳細はログを確認してください。\n";
56        echo sprintf("発生箇所: %s行目\n", $lineNumber);
57    }
58}
59
60// 処理を実行
61processData();

このPHPサンプルコードは、例外が発生した行番号を取得し、エラー情報と連携させる方法を示しています。

UnderflowExceptionはPHPの組み込み例外クラスの一つで、コンテナが空の状態で値を取り出そうとした場合などに使用されます。このクラスは親クラスからgetLine()メソッドを継承しており、このメソッドを呼び出すことで、例外が投げられた(throwされた)ソースコードの行番号を取得できます。getLine()メソッドに引数はなく、戻り値として行番号を表す整数(int)を返します。

サンプルコードでは、まずDataProcessorクラスのpopメソッド内で、スタックが空のときに意図的にUnderflowExceptionをスローしています。次に、processData関数内のtry...catchブロックでこの例外を捕捉します。catchブロックでは、捕捉した例外オブジェクト$eに対して$e->getLine()を実行し、例外が発生した具体的な行番号を取得しています。

最後に、取得した行番号をerror_log関数で出力するエラーメッセージに組み込むことで、開発者はログを見るだけで、どのファイルの何行目で問題が起きたのかを正確に特定できます。このようにgetLine()は、エラー発生箇所の情報とログ機能を連携させ、デバッグ作業を効率化するために非常に役立ちます。

サンプルコードは、例外が発生した行番号を取得し、エラーログと連携させる方法を示しています。注意点として、行番号はプロパティへ直接アクセスするのではなく$e->getLine()メソッドで取得します。これはUnderflowExceptionが継承しているThrowableインターフェースで定義された標準的な方法です。このメソッドで取得できるのは、例外をthrowした箇所(この例ではDataProcessorクラス内のthrow new ...の行)の行番号であり、呼び出し元の行番号ではない点を理解することが重要です。このようにファイル名、行番号、エラーメッセージを連携させてerror_log関数などで記録することは、エラー発生時の原因調査を迅速に行うために不可欠な実践的テクニックです。ユーザー向けのエラー表示と、開発者向けのデバッグ情報を分けて管理する良い習慣にも繋がります。

関連コンテンツ