Menu
CoddyTech

Sử dụng ngoại lệ tùy chỉnh

Thuộc phần Logic và luồng chương trình trong hành trình PHP của Coddy. Bài học 57 trên 68.

Bây giờ bạn đã tạo lớp ngoại lệ tùy chỉnh của riêng mình, đã đến lúc áp dụng nó vào thực tế. Sử dụng ngoại lệ tùy chỉnh gồm hai bước chính: ném loại ngoại lệ cụ thể khi xảy ra sự cố, rồi bắt loại ngoại lệ đó để xử lý phù hợp.

Khi ném một ngoại lệ tùy chỉnh, bạn dùng cùng từ khóa throw, nhưng tạo một đối tượng thuộc lớp tùy chỉnh thay vì lớp Exception chung. Cách này giúp bạn xử lý lỗi chính xác và có ý nghĩa hơn.

<?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!";
}
?>

Sức mạnh thực sự thể hiện khi bắt ngoại lệ tùy chỉnh của bạn. Thay vì bắt ngoại lệ chung Exception, bạn có thể bắt ngoại lệ cụ thể InvalidEmailException. Nhờ vậy, bạn có thể xử lý từng loại lỗi theo cách khác nhau, giúp việc xử lý lỗi chính xác và giàu thông tin hơn.

<?php
try {
    validateEmail("invalid-email");
} catch (InvalidEmailException $e) {
    echo "Email error: " . $e->getMessage();
}
?>

Cách tiếp cận này giúp bạn kiểm soát chính xác việc xử lý lỗi, cho phép bạn phản hồi khác nhau với từng loại sự cố trong ứng dụng.

challenge icon

Thử thách

Dễ

Bạn sẽ nhận ba đầu vào: một chuỗi tên người dùng, một chuỗi mật khẩu và một số biểu thị độ dài tối thiểu của mật khẩu. Tên người dùng không được để trống, còn mật khẩu phải đáp ứng yêu cầu về độ dài tối thiểu.

Tạo một lớp ngoại lệ tùy chỉnh có tên InvalidCredentialsException, kế thừa lớp cơ sở Exception.

Tạo một hàm (function) có tên validateCredentials, nhận ba tham số: tên người dùng, mật khẩu và độ dài tối thiểu. Bên trong hàm này:

  • Nếu tên người dùng để trống (là một chuỗi rỗng), hãy ném một ngoại lệ InvalidCredentialsException với thông báo "Username cannot be empty"
  • Nếu độ dài mật khẩu nhỏ hơn độ dài tối thiểu, hãy ném một ngoại lệ InvalidCredentialsException với thông báo "Password must be at least X characters long" (trong đó X là giá trị độ dài tối thiểu)
  • Nếu cả hai bước kiểm tra đều đạt, hãy in ra "Credentials are valid"

Dùng khối try...catch để gọi hàm với các đầu vào đã cho. Trong khối catch, bắt riêng ngoại lệ InvalidCredentialsException và in ra "Validation error: ", theo sau là thông báo ngoại lệ bằng phương thức getMessage().

Định dạng đầu vào:

  • Dòng đầu tiên: Một chuỗi biểu thị tên người dùng (ví dụ: john_doe hoặc một chuỗi rỗng)
  • Dòng thứ hai: Một chuỗi biểu thị mật khẩu (ví dụ: pass123)
  • Dòng thứ ba: Một số nguyên biểu thị độ dài tối thiểu của mật khẩu (ví dụ: 8)

Đầu ra mong đợi:

  • Nếu thông tin đăng nhập hợp lệ: Credentials are valid
  • Nếu tên người dùng để trống: Validation error: Username cannot be empty
  • Nếu mật khẩu quá ngắn: Validation error: Password must be at least X characters long (trong đó X là độ dài tối thiểu)

Tự làm thử

<?php
// Đọc đầu vào
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$minLength = intval(fgets(STDIN));

// TODO: Viết code bên dưới
// 1. Tạo lớp InvalidCredentialsException
// 2. Tạo hàm validateCredentials
// 3. Dùng khối lệnh try...catch để gọi hàm và xử lý ngoại lệ

?>
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch PHP online