使用自定义异常
本课属于 Coddy PHP 学习旅程的“逻辑与流程”单元。第 57 课,共 68 课。
现在你已经创建了自己的自定义异常类,是时候在实际场景中使用它了。使用自定义异常需要两个关键步骤:出现问题时抛出特定类型的异常,并捕获该异常类型来妥善处理。
抛出自定义异常时,你仍然使用相同的 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!";
}
?>真正的强大之处在于捕获你自定义的异常。你可以捕获特定的 InvalidEmailException,而不是通用的 Exception。这样,你就能用不同的方式处理不同类型的错误,让错误处理更有针对性,也能提供更多信息。
<?php
try {
validateEmail("invalid-email");
} catch (InvalidEmailException $e) {
echo "Email error: " . $e->getMessage();
}
?>这种方法可以让你精确控制错误处理,从而针对应用中的不同问题采取不同的响应方式。
挑战
简单你会收到 3 个输入:用户名字符串、密码字符串和表示密码最小长度的数字。用户名不能为空,密码长度必须达到最小长度要求。
创建一个名为 InvalidCredentialsException 的自定义异常类,并让它继承基类 Exception。
创建一个名为 validateCredentials 的函数,接受 3 个参数:用户名、密码和最小长度。在这个函数中:
- 如果用户名为空(空字符串),抛出一个
InvalidCredentialsException异常,并使用消息"Username cannot be empty" - 如果密码长度小于最小长度,抛出一个
InvalidCredentialsException异常,并使用消息"Password must be at least X characters long"(其中 X 是最小长度值) - 如果两项检查都通过,打印
"Credentials are valid"
使用 try...catch 代码块,传入提供的输入来调用函数。在 catch 代码块中,专门捕获 InvalidCredentialsException,并打印 "Validation error: ",后面接上使用 getMessage() 方法获取的异常消息。
输入格式:
- 第一行:表示用户名的字符串(例如:
john_doe或空字符串) - 第二行:表示密码的字符串(例如:
pass123) - 第三行:表示密码最小长度的整数(例如:
8)
预期输出:
- 如果凭据有效:
Credentials are valid - 如果用户名为空:
Validation error: Username cannot be empty - 如果密码太短:
Validation error: Password must be at least X characters long(其中 X 是最小长度)
亲手试试
<?php
// 读取输入
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$minLength = intval(fgets(STDIN));
// TODO:在下方编写你的代码
// 1. 创建 InvalidCredentialsException 类
// 2. 创建 validateCredentials 函数
// 3. 使用 try...catch 代码块调用函数并处理异常
?>这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: PHP 在线编译器