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.
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ệ
InvalidCredentialsExceptionvớ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ệ
InvalidCredentialsExceptionvớ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_doehoặ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ệ
?>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
1Hàm nâng cao
Hàm ẩn danhClosure và 'use'Hàm mũi tênHàm callbackDùng 'call_user_func'Hàm biếnTruyền tham chiếuHàm đệ quyÔn tập: tổng hợp về hàm4Mảng đa chiều
Tạo mảng 2 chiềuTruy cập phần tử trong mảng 2 chiềuChỉnh sửa phần tử trong mảng 2 chiềuLặp qua các vòng lặp lồng nhauMảng kết hợp 2 chiềuÔn tập: bài tập lưới đơn giản2Thao tác nâng cao với mảng
Thêm phần tử bằng 'array_push'Xóa phần tử bằng 'array_pop'Thêm phần tử vào đầu mảng bằng 'array_unshift'Xóa phần tử đầu mảng bằng 'array_shift'Gộp các mảng được đánh chỉ sốGộp các mảng kết hợpTrích xuất phần tử bằng 'array_slice'Kiểm tra giá trị bằng 'in_array'Tìm khóa bằng 'array_search'Ôn tập: bài tập về danh sách phát5Sổ điểm học sinh
Thiết lập dự án: cấu trúc dữ liệuThêm học sinh mớiThêm điểm cho học sinhTính điểm trung bình của học sinhTìm học sinh có điểm cao nhấtTạo bảng điểm8Xử lý lỗi và ngoại lệ
Hiểu về lỗi trong PHPKhối try...catchKhối finallyNém ngoại lệTạo ngoại lệ tùy chỉnhSử dụng ngoại lệ tùy chỉnhÔn tập: Xác thực đầu vào3Sắp xếp mảng
Sắp xếp mảng có chỉ số tăng dầnSắp xếp mảng có chỉ số giảm dầnSắp xếp mảng kết hợp theo giá trịSắp xếp mảng kết hợp theo khóaSắp xếp theo thứ tự tự nhiênSắp xếp tùy chỉnh bằng 'usort'Ôn tập: Sắp xếp bảng xếp hạngTự luyện tập: Trình biên dịch PHP online