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

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

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

作成日: 更新日:

基本的な使い方

『lineプロパティは、RangeException例外がスローされたソースコード上の行番号を保持するプロパティです。このプロパティは、PHPの基本的な例外クラスであるExceptionから継承されているため、RangeExceptionを含む多くの例外オブジェクトで利用できます。プログラムの実行中に、値が期待される有効な範囲にないといった問題が発生した場合、どのファイルのどの行でその問題が起きたのかを正確に特定することは、デバッグ作業において非常に重要です。lineプロパティにはその発生箇所の行番号が数値として格納されており、開発者はエラーの原因を迅速に突き止めるための手がかりを得ることができます。通常、このプロパティはprotectedとして定義されているため、オブジェクトから直接アクセスするのではなく、公開されているgetLine()メソッドを使用して値を取得します。try-catch構文でRangeExceptionを捕捉した際に、その例外オブジェクトのgetLine()メソッドを呼び出すことで、具体的なエラー発生箇所を把握し、プログラムの修正に役立てることが可能です。

構文(syntax)

1<?php
2
3function checkAge(int $age)
4{
5    if ($age < 0 || $age > 150) {
6        throw new RangeException("Age is out of the valid range.");
7    }
8}
9
10try {
11    checkAge(200);
12} catch (RangeException $e) {
13    // Access the protected 'line' property value via the public getLine() method.
14    echo $e->getLine();
15}
16

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

このプロパティは、例外が発生した行番号を整数型で返します。

サンプルコード

PHP RangeExceptionのlineを送信する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * 指定されたスコアが有効な範囲(0-100)にあるか検証し、
7 * 範囲外の場合はエラー情報を送信(ここでは画面に表示)します。
8 *
9 * @param int $score 検証するスコア
10 * @return void
11 */
12function sendScoreReport(int $score): void
13{
14    try {
15        // スコアが0未満または100より大きい場合、例外をスローする
16        if ($score < 0 || $score > 100) {
17            // RangeExceptionは、値が有効な範囲にないことを示すための例外
18            throw new RangeException('スコアは0から100の間で指定してください。');
19        }
20
21        echo "スコア: {$score} 点を正常に送信しました。" . PHP_EOL;
22    } catch (RangeException $e) {
23        // catchブロックでスローされたRangeExceptionを捕捉する
24
25        // エラーレポートを作成
26        $errorReport = [
27            'level' => 'ERROR',
28            'message' => $e->getMessage(), // 例外のメッセージを取得
29            'file' => $e->getFile(),       // 例外が発生したファイル名を取得
30            'line' => $e->getLine(),       // 例外が発生した行番号を取得
31        ];
32
33        // 本来はログファイルや外部サービスに送信するが、ここでは画面に表示する
34        echo "--- エラーレポート送信 ---" . PHP_EOL;
35        echo "レベル: " . $errorReport['level'] . PHP_EOL;
36        echo "メッセージ: " . $errorReport['message'] . PHP_EOL;
37        echo "ファイル: " . $errorReport['file'] . PHP_EOL;
38        echo "発生行: " . $errorReport['line'] . "行目" . PHP_EOL; // getLine()で取得した行番号
39        echo "--------------------------" . PHP_EOL;
40    }
41}
42
43// 正常な値を送信するテスト
44sendScoreReport(85);
45
46echo PHP_EOL;
47
48// 意図的に範囲外の値を送信し、例外を発生させるテスト
49sendScoreReport(150);

このPHPサンプルコードは、指定されたスコアが有効な範囲(0〜100)にあるかを確認し、範囲外だった場合にエラー情報を送信する処理をシミュレートするものです。

sendScoreReport関数内ではtry...catch構文が使われています。tryブロック内で、スコアが0未満または100より大きい場合にthrow new RangeException()によって意図的に例外を発生させます。RangeExceptionは、値が期待される範囲にないことを示すための例外クラスです。

発生した例外はcatchブロックで捕捉され、その詳細情報が例外オブジェクト$eに格納されます。ここで使用されている$e->getLine()メソッドが、今回の中心となる機能です。このメソッドは、例外が発生したソースコードの行番号を取得します。引数はなく、戻り値として行番号を整数(int型)で返します。

このコードでは、getLine()で取得した行番号を、エラーメッセージやファイル名と共にエラーレポートの一部として画面に出力しています。このように、エラー発生箇所を正確に特定できるため、デバッグやエラーログを外部サービスへ送信する際に非常に役立ちます。

getLine()メソッドは、catchブロックで例外を捕まえた場所ではなく、throwで例外が投げられた行番号を返します。これによりエラーの発生源を正確に特定でき、デバッグが容易になります。try...catch構文は、例外が発生した際にプログラムが即座に停止するのを防ぎ、エラー処理を安全に行うための重要な仕組みです。サンプルコードではエラーレポートを画面に出力していますが、実際のシステム開発では、ログファイルへの記録やエラー監視サービスへの送信が一般的です。ユーザーにエラーの詳細情報を直接見せることは、セキュリティのリスクを高めるため避けるべきです。

PHP RangeException の line プロパティでエラー行番号を取得・連携する

1<?php
2
3/**
4 * 指定された値が有効な配列のインデックス範囲内にあるかチェックします。
5 *
6 * @param array<int, string> $data データ配列
7 * @param int $index チェックするインデックス
8 * @return string データ配列の要素
9 * @throws RangeException インデックスが範囲外の場合
10 */
11function getValueByIndex(array $data, int $index): string
12{
13    // 配列のキーが存在するかチェック
14    if (!isset($data[$index])) {
15        // 存在しない場合、RangeExceptionをスローする
16        // この例外がスローされた行の番号が、$e->getLine() で取得される
17        throw new RangeException("無効なインデックス: {$index}");
18    }
19    return $data[$index];
20}
21
22// サンプルデータ
23$userNames = [1 => 'Alice', 2 => 'Bob', 3 => 'Charlie'];
24
25try {
26    // 意図的に範囲外のインデックスを指定して、例外を発生させる
27    $indexToSearch = 99;
28    echo "インデックス {$indexToSearch} のユーザー名を検索します...\n";
29    $userName = getValueByIndex($userNames, $indexToSearch);
30    echo "ユーザー名: {$userName}\n";
31
32} catch (RangeException $e) {
33    // RangeExceptionをキャッチする
34
35    // $e->getLine() を使って、例外が発生したソースコードの行番号を取得
36    $errorLine = $e->getLine();
37
38    // 取得した行番号を、他のエラー情報と「連携」させてログメッセージを生成
39    $logMessage = sprintf(
40        "[ERROR] 例外発生! ファイル: %s, 行番号: %d, メッセージ: %s",
41        $e->getFile(),
42        $errorLine, // ここで取得した行番号を利用
43        $e->getMessage()
44    );
45
46    // 生成したログメッセージをエラーログ(または画面)に出力
47    // 本来は error_log() などでファイルに記録する
48    echo $logMessage . "\n";
49}

このPHPサンプルコードは、RangeExceptionが発生した際に、その例外がソースコードのどの行で発生したかを取得する方法を示しています。RangeExceptionオブジェクトは、例外がスローされた場所に関する情報を持っており、getLine()メソッドを使うことでその行番号を取得できます。

getLine()メソッドは引数を取らず、例外がthrowされた行番号を整数(int)で返します。サンプルコードでは、getValueByIndex関数内で配列の範囲外のインデックスが指定された場合に、意図的にRangeExceptionをスローしています。try...catchブロックでこの例外を捕捉し、catchブロック内で、例外オブジェクト$eに対して$e->getLine()を呼び出すことで、throw new RangeException(...)が実行された具体的な行番号を取得しています。

このコードのポイントは、取得した行番号を他のエラー情報と「連携」させている点です。$e->getFile()で取得したファイル名や、$e->getMessage()で取得したエラーメッセージと行番号を組み合わせることで、いつ、どこで、どのようなエラーが発生したのかを正確に記録したログメッセージを生成できます。このように複数の情報を連携させることは、エラーの原因を迅速に特定し、デバッグ作業を効率化するために非常に重要です。

$e->getLine()で取得できる行番号は、catchで例外を捕捉した場所ではなく、throwキーワードで例外が実際に発生した箇所の行番号を指します。この違いを理解することがデバッグで重要です。サンプルコードのように、例外が発生しうる処理はtryブロックで囲み、catchブロックで適切に処理しないと、プログラムが強制終了してしまいます。$e->getLine()で得た行番号は、$e->getFile()(ファイル名)や$e->getMessage()(エラー内容)と連携させてログに出力することで、エラーの原因特定が非常に容易になります。実際の開発では、画面にエラー詳細を表示するのではなく、error_log()関数などを用いてファイルに記録するのが一般的です。

関連コンテンツ