カスタム例外の使用
CoddyのPHPジャーニー「論理とフロー」セクションの一部 — レッスン 57/68。
独自のカスタム例外クラスを作成したので、次はそれを実際に活用してみましょう。カスタム例外を使用するには、2つの主要なステップがあります。問題が発生したときに特定の例外タイプをスロー(throw)することと、その特定の例外タイプをキャッチ(catch)して適切に処理することです。
カスタム例外をスローする場合、同じ throw キーワードを使用しますが、汎用的な Exception クラスではなく、カスタムクラスのインスタンスを作成します。これにより、エラーハンドリングがより正確で意味のあるものになります。
<?php
class InvalidEmailException extends Exception {}
function validateEmail($email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidEmailException("Invalid email format: " . $email);
}
echo "Email is valid!";
}
?>自作の例外をキャッチするときに、真の力が発揮されます。汎用的な Exception をキャッチする代わりに、特定の InvalidEmailException をキャッチできます。これにより、異なる種類のエラーを異なる方法で処理できるようになり、エラーハンドリングをより的確で情報量の多いものにすることができます。
<?php
try {
validateEmail("invalid-email");
} catch (InvalidEmailException $e) {
echo "Email error: " . $e->getMessage();
}
?>このアプローチにより、エラーハンドリングを正確に制御できるようになり、アプリケーション内のさまざまな種類の問題に対して、異なる対応をすることが可能になります。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単ユーザー名(文字列)、パスワード(文字列)、およびパスワードの最小長(数値)の3つの入力を受け取ります。ユーザー名は空であってはならず、パスワードは最小長の要件を満たす必要があります。
ベースとなる Exception クラスを継承した、InvalidCredentialsException という名前のカスタム例外クラスを作成してください。
username、password、および minimum length の3つのパラメータを受け取る validateCredentials という名前の関数を作成してください。この関数内では以下の処理を行います:
- ユーザー名が空(空文字列)の場合、メッセージ
"Username cannot be empty"を持つInvalidCredentialsExceptionをスローします。 - パスワードの長さが最小長未満の場合、メッセージ
"Password must be at least X characters long"(X は最小長の数値)を持つInvalidCredentialsExceptionをスローします。 - 両方のバリデーションを通過した場合は、
"Credentials are valid"と出力します。
try...catch ブロックを使用して、提供された入力で関数を呼び出します。catch ブロックでは、InvalidCredentialsException を明示的にキャッチし、"Validation error: " に続けて getMessage() メソッドを使用して例外メッセージを出力してください。
入力形式:
- 1行目: ユーザー名を表す文字列(例:
john_doeまたは空文字列) - 2行目: パスワードを表す文字列(例:
pass123) - 3行目: パスワードの最小長を表す整数(例:
8)
期待される出力:
- 資格情報が有効な場合:
Credentials are valid - ユーザー名が空の場合:
Validation error: Username cannot be empty - パスワードが短すぎる場合:
Validation error: Password must be at least X characters long(X は最小長)
チートシート
カスタム例外を使用するには、カスタムクラスのインスタンスをスローし、その特定の例外タイプをキャッチします:
<?php
class InvalidEmailException extends Exception {}
function validateEmail($email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidEmailException("Invalid email format: " . $email);
}
echo "Email is valid!";
}
try {
validateEmail("invalid-email");
} catch (InvalidEmailException $e) {
echo "Email error: " . $e->getMessage();
}
?>これにより、汎用的な Exception オブジェクトではなく、特定の例外タイプをキャッチすることで、正確なエラーハンドリングが可能になります。
自分で試してみよう
<?php
// 入力を読み込む
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$minLength = intval(fgets(STDIN));
// TODO: 以下にコードを記述してください
// 1. InvalidCredentialsExceptionクラスを作成する
// 2. validateCredentials関数を作成する
// 3. try...catchブロックを使用して関数を呼び出し、例外を処理する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。