例外のスロー
CoddyのPHPジャーニー「論理とフロー」セクションの一部 — レッスン 55/68。
コード内で何かがうまくいかなかったことを知らせ、通常の実行を停止させる必要がある場合があります。throw キーワードを使用すると、手動で例外を作成してスローすることができ、プログラムがいつ、なぜエラー条件を処理すべきかを制御できるようになります。
例外をスローするとき、新しい Exception オブジェクトを作成し、何が問題だったのかを説明するメッセージを渡します。この例外は、現在のコードの実行を即座に停止し、それを処理するための catch ブロックを探します。
<?php
function checkAge($age) {
if ($age < 0) {
throw new Exception("Age cannot be negative");
}
echo "Age is valid: " . $age;
}
try {
checkAge(-5);
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
?>throw 文には、問題を説明する文字列メッセージを渡す new Exception() 構文が必要です。このメッセージは、後で catch ブロック内の getMessage() メソッドを使用して取得できるため、何が問題だったのかを理解し、適切に対応することが容易になります。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単2つの入力値を受け取ります。1つは価格を表す数値、もう1つは割引率を表す数値です。どちらの入力も数値として提供されます(価格は小数の場合があり、割引率は0から100の間の整数です)。
両方の入力を読み取り、価格と割引率の2つのパラメータを受け取る calculateFinalPrice という関数を作成してください。この関数の中で、割引率が100より大きいか、または0より小さいかを確認してください。どちらかの条件が真である場合、"Invalid discount percentage" というメッセージを持つ新しい Exception をスローしてください。割引率が有効な場合は、割引適用後の最終価格を計算して返してください。
try...catch ブロックを使用して、提供された入力で関数を呼び出します。try ブロック内では、関数を呼び出し、"Final price: " に続いて計算された最終価格を出力してください。catch ブロックでは、getMessage() メソッドを使用して、"Error: " に続いて例外メッセージを出力することで例外を処理してください。
入力形式:
- 1行目: 価格を表す数値(例:
100または49.99) - 2行目: 割引率を表す整数(例:
20または150)
期待される出力:
- 割引率が有効な場合:
Final price:に続いて割引後の計算された価格 - 割引率が無効な場合:
Error: Invalid discount percentage
チートシート
throw キーワードを使用して、手動で例外を作成し、スローします:
throw new Exception("Error message");例外がスローされると、通常の実行が停止し、それを処理するための catch ブロックを探します:
<?php
function checkAge($age) {
if ($age < 0) {
throw new Exception("Age cannot be negative");
}
echo "Age is valid: " . $age;
}
try {
checkAge(-5);
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
?>catch ブロック内で getMessage() メソッドを使用して、例外メッセージを取得します。
自分で試してみよう
<?php
// 入力を読み込む
$price = floatval(fgets(STDIN));
$discountPercentage = intval(fgets(STDIN));
// TODO: 以下にコードを記述してください
// calculateFinalPrice 関数を作成します
// try...catch ブロックを使用して関数を呼び出し、例外を処理します
// 適切な出力を表示します
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。