【PHP8.x】DomainException::lineプロパティの使い方
lineプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『lineプロパティは、例外がスローされたソースコードの行番号を保持するプロパティです。このプロパティは、PHPの基本的な例外クラスであるExceptionクラスで定義されています。DomainExceptionはExceptionクラスを継承しているため、DomainExceptionのオブジェクトもこのlineプロパティを持っています。プログラムの実行中に、ある値が期待される範囲外であるといった理由でDomainExceptionが発生した場合、このプロパティには、その例外がどのファイルの何行目で発生したかという具体的な位置情報が自動的に格納されます。この行番号は、開発者がデバッグを行う際に、エラーの原因となっている箇所を迅速に特定するための非常に重要な手がかりとなります。通常、このプロパティに格納された値は、オブジェクトに用意されているgetLine()メソッドを呼び出すことで取得します。try-catch構文で例外を捕捉し、このメソッドを使うことで、エラーの発生行をログに出力するなど、詳細なエラーハンドリングを実装できます。このようにlineプロパティは、エラーの発生源を正確に突き止め、プログラムの安定性を向上させるために不可欠な情報を提供します。』
構文(syntax)
1<?php 2 3try { 4 throw new DomainException('ドメインエラーが発生しました。'); 5} catch (DomainException $e) { 6 echo $e->getLine(); 7}
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
このプロパティは、例外が発生したソースコードの行番号を整数型で返します。
サンプルコード
PHP DomainExceptionのlineを取得し送信する
1<?php 2 3/** 4 * 年齢を検証し、無効な場合はDomainExceptionをスローする関数. 5 * 6 * @param int $age 検証する年齢 7 * @return void 8 * @throws DomainException 年齢が0未満の場合 9 */ 10function validateUserAge(int $age): void 11{ 12 // 年齢が有効なドメイン(範囲)にない場合、例外をスローします。 13 if ($age < 0) { 14 // この行で例外が生成されます。 15 throw new DomainException('年齢は0以上の値を指定してください。'); 16 } 17 18 echo "年齢 {$age}歳 は有効です。\n"; 19} 20 21/** 22 * エラー情報を送信する(この例では画面に出力する)関数. 23 * 24 * @param Throwable $e 捕捉した例外オブジェクト 25 * @return void 26 */ 27function sendErrorLog(Throwable $e): void 28{ 29 // getLine()メソッドで例外がスローされた行番号を取得します。 30 $errorLine = $e->getLine(); 31 $errorMessage = $e->getMessage(); 32 $errorFile = $e->getFile(); 33 34 // 取得した行番号を含むエラー情報を整形して「送信」します。 35 // 実際のシステムでは、この情報をログファイルや外部サービスに送信します。 36 $logMessage = sprintf( 37 "[ERROR] %s (file: %s, line: %d)\n", 38 $errorMessage, 39 $errorFile, 40 $errorLine 41 ); 42 43 echo "--- エラーログを送信 ---\n"; 44 echo $logMessage; 45 echo "-----------------------\n"; 46} 47 48// メイン処理 49try { 50 // 正常なケース 51 validateUserAge(30); 52 53 // 例外が発生するケース 54 validateUserAge(-5); 55} catch (DomainException $e) { 56 // スローされた例外を捕捉し、エラー情報を送信する関数を呼び出します。 57 sendErrorLog($e); 58}
このPHPサンプルコードは、関数の引数が不正な値であった場合にDomainExceptionという例外を発生させ、そのエラー情報を外部に送信する処理を模擬しています。
DomainExceptionオブジェクトは、エラーが発生した際の様々な情報を持っています。その一つがlineプロパティで、これは例外がどの行で発生したかを示す「行番号」を保持しています。この値は、getLine()メソッドを呼び出すことで取得できます。getLine()メソッドは引数を取らず、戻り値として例外が生成された行番号を整数(int型)で返します。
サンプルコードでは、validateUserAge関数内で年齢が負の値のときにthrow new DomainException(...)によって例外がスローされます。try...catch構文でこの例外オブジェクトを捕捉し、sendErrorLog関数に渡します。sendErrorLog関数内では、受け取った例外オブジェクトのgetLine()メソッドを呼び出してエラー発生行の番号を取得し、メッセージやファイル名と組み合わせてログを作成しています。このように、エラーが発生した正確な行番号を記録・送信することで、問題箇所の特定が容易になり、迅速なデバッグや修正に役立ちます。
$e->getLine()で取得できる行番号は、例外がthrowされた場所を指します。このサンプルでは、validateUserAge関数内のthrow new DomainException(...)と書かれた行です。例外をcatchした行や、関数を呼び出した行ではない点に注意が必要です。DomainExceptionは、値が期待される範囲外であるといった論理的なエラーを示すための例外です。サンプルコードのsendErrorLog関数は、エラー情報を画面に出力するだけですが、実際の開発ではファイルに書き込んだり、外部の監視サービスへ送信したりします。例外オブジェクトには行番号の他にもファイル名を取得するgetFile()など、デバッグに役立つ情報を取得するメソッドが用意されています。
LINE連携エラー処理とDomainException
1<?php 2 3declare(strict_types=1); 4 5/** 6 * LINE連携処理におけるドメインエラーをシミュレートするクラス 7 */ 8class LineMessageValidator 9{ 10 /** 11 * LINEユーザーIDを検証し、メッセージを送信する処理をシミュレートします。 12 * 13 * ユーザーIDがLINEの仕様(この例では 'U' で始まる33文字の文字列)と異なる場合、 14 * DomainExceptionをスローします。 15 * 16 * @param string $userId LINEユーザーID 17 * @param string $message 送信するメッセージ 18 * @throws \DomainException ユーザーIDがドメインルールに違反した場合 19 */ 20 public function validateAndSend(string $userId, string $message): void 21 { 22 // LINEユーザーIDの形式を正規表現で検証 23 if (!preg_match('/^U[a-zA-Z0-9]{32}$/', $userId)) { 24 // 無効な形式の場合、ドメインエラーとして例外をスロー 25 throw new \DomainException("無効な形式のLINEユーザーIDです。"); 26 } 27 28 // 本来はここでLINE Messaging APIへのリクエストを実装 29 echo "ユーザーID '{$userId}' へメッセージ '{$message}' の送信シミュレーションに成功しました。\n"; 30 } 31} 32 33$validator = new LineMessageValidator(); 34 35// 不正な形式のユーザーID 36$invalidUserId = 'invalid-line-user-id'; 37$message = 'こんにちは!'; 38 39try { 40 // 検証処理を実行 41 echo "検証を開始します...\n"; 42 $validator->validateAndSend($invalidUserId, $message); 43} catch (\DomainException $e) { 44 // DomainExceptionをキャッチし、エラー情報を出力 45 // $e->getLine() (lineプロパティ) で例外がスローされた行番号を取得 46 echo "----------------------------------------\n"; 47 echo "エラー: LINE連携処理中に問題が発生しました。\n"; 48 echo "メッセージ: " . $e->getMessage() . "\n"; 49 echo "ファイル: " . $e->getFile() . "\n"; 50 echo "発生行: " . $e->getLine() . "行目\n"; // DomainExceptionのlineプロパティから情報を取得 51 echo "----------------------------------------\n"; 52} 53
このPHPサンプルコードは、LINE連携処理を模倣し、不正な形式のユーザーIDが渡された場合にDomainExceptionという種類の例外(エラー)を発生させる例です。DomainExceptionは、「LINEのユーザーIDは特定の形式でなければならない」といった、プログラム固有のビジネスルールや仕様(ドメインルール)に違反したデータが原因で処理を続行できないときに使用されます。
このコードのcatchブロックで使われている$e->getLine()は、DomainExceptionクラスが持つlineプロパティの値を取得するメソッドです。lineプロパティは、プログラムの実行中に例外がthrow(スロー、つまり発生)されたソースコード上の具体的な行番号を整数(int)型で保持しています。getLine()メソッドには引数はなく、戻り値としてこの行番号が返されます。
サンプルでは、LineMessageValidatorクラスのvalidateAndSendメソッド内で、無効なユーザーIDが原因でthrow new \DomainException(...)が実行されます。try...catch構文がこの例外を捕捉し、$e->getLine()を呼び出すことで、エラーが発生した正確な行番号を取得して出力しています。このように、エラー発生箇所の行番号を特定できるため、開発者は問題の原因調査を迅速に行え、デバッグ作業が効率的になります。
このコードは、LINEユーザーIDの形式が不正な場合に DomainException という例外を発生させています。この例外は、アプリケーション独自のルール(ドメインルール)に違反した際に使用するのが一般的です。try...catch構文で例外を捕まえないとプログラムが停止してしまうため、特に外部サービス連携では必須の記述です。catchブロックで使われている $e->getLine() は、例外が throw されたコードの具体的な行番号を取得します。これによりエラー発生箇所を正確に特定でき、デバッグが容易になります。なお、サンプルコードのユーザーID検証はあくまで一例のため、実際の開発ではLINEの公式ドキュメントで最新の仕様を確認することが重要です。