Ném ngoại lệ
Thuộc phần Logic và luồng điều khiển trong hành trình Dart của Coddy. Bài học 42 trên 65.
Đôi khi bạn cần tự tạo điều kiện gây lỗi trong code. Từ khóa throw cho phép bạn chủ động kích hoạt một ngoại lệ khi chương trình gặp tình huống không nên tiếp tục.
Khi bạn throw một ngoại lệ (exception), về cơ bản bạn đang nói: “Dừng mọi thứ lại, có gì đó không ổn ở đây.” Cách này hữu ích khi kiểm tra đầu vào hoặc áp dụng quy tắc trong các hàm (function). Bạn có thể ném một thông báo dạng chuỗi đơn giản hoặc tạo các kiểu ngoại lệ cụ thể hơn.
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
print("Age is valid: $age");
}Trong ví dụ này, nếu ai đó thử truyền vào một độ tuổi âm, hàm sẽ lập tức ném ra một ngoại lệ kèm thông báo mô tả. Nhờ đó, phần còn lại của hàm không chạy với dữ liệu không hợp lệ, giúp code của bạn đáng tin cậy hơn và dễ gỡ lỗi hơn.
Việc ném ngoại lệ đặc biệt hữu ích trong các hàm cần kiểm tra tính hợp lệ của đầu vào trước khi thực hiện những thao tác quan trọng.
Thử thách
DễTạo chương trình kiểm tra thông tin tài khoản người dùng bằng cách viết các hàm kiểm tra tùy chỉnh, có thể ném ngoại lệ khi phát hiện dữ liệu không hợp lệ. Chương trình cần kiểm tra nhiều trường thông tin tài khoản và ném thông báo lỗi cụ thể cho từng trường hợp kiểm tra không đạt.
- Đọc một chuỗi đầu vào đại diện cho tên người dùng
- Đọc một chuỗi đầu vào đại diện cho địa chỉ email
- Đọc một chuỗi đầu vào đại diện cho tuổi
- Đọc một chuỗi đầu vào đại diện cho mật khẩu
- Tạo hàm có tên
validateUsernameđể kiểm tra tên người dùng có hợp lệ hay không: - Nếu tên người dùng trống hoặc có ít hơn 3 ký tự, ném ngoại lệ:
"Username must be at least 3 characters long" - Nếu tên người dùng chứa dấu cách, ném ngoại lệ:
"Username cannot contain spaces" - Nếu kiểm tra thành công, in ra:
"Username validation passed" - Tạo hàm có tên
validateEmailđể kiểm tra email có hợp lệ hay không: - Nếu email không chứa ký hiệu
@, ném ngoại lệ:"Email must contain @ symbol" - Nếu email không chứa dấu chấm
.sau ký hiệu@, ném ngoại lệ:"Email must contain a valid domain" - Nếu kiểm tra thành công, in ra:
"Email validation passed" - Tạo hàm có tên
validateAgeđể kiểm tra tuổi có hợp lệ hay không: - Chuyển chuỗi tuổi thành số nguyên bằng
int.parse() - Nếu tuổi nhỏ hơn 13, ném ngoại lệ:
"Age must be at least 13 years old" - Nếu tuổi lớn hơn 120, ném ngoại lệ:
"Age must be realistic (under 120)" - Nếu kiểm tra thành công, in ra:
"Age validation passed" - Tạo hàm có tên
validatePasswordđể kiểm tra mật khẩu có hợp lệ hay không: - Nếu mật khẩu ngắn hơn 8 ký tự, ném ngoại lệ:
"Password must be at least 8 characters long" - Nếu kiểm tra thành công, in ra:
"Password validation passed" - Gọi lần lượt từng hàm kiểm tra và xử lý mọi ngoại lệ phát sinh
- Hiển thị kết quả theo đúng định dạng bên dưới
Ví dụ, nếu đầu vào là "john", "john@email.com", "25", "password123", chương trình cần in ra:
Account Validation System
=========================
Validating username: john
Username validation passed
Validating email: john@email.com
Email validation passed
Validating age: 25
Age validation passed
Validating password: password123
Password validation passed
=========================
All validations passed successfully!
Account created for user: johnNếu đầu vào là "jo", "john@email.com", "25", "password123", chương trình cần in ra:
Account Validation System
=========================
Validating username: jo
Validation Error: Username must be at least 3 characters long
Account creation failed due to validation errorsNếu đầu vào là "john doe", "johnemail.com", "12", "pass", chương trình cần in ra:
Account Validation System
=========================
Validating username: john doe
Validation Error: Username cannot contain spaces
Account creation failed due to validation errorsChương trình phải gọi từng hàm kiểm tra theo đúng thứ tự: tên người dùng, email, tuổi, rồi đến mật khẩu. Dừng kiểm tra và hiển thị thông báo lỗi ngay khi có bước kiểm tra không đạt. Dùng từ khóa throw để chủ động ném ngoại lệ kèm các thông báo lỗi cụ thể như trên. Mỗi hàm kiểm tra cần kiểm tra trường tương ứng và ném ngoại lệ nếu bước kiểm tra không đạt, hoặc in ra thông báo thành công nếu đạt.
Tự làm thử
import 'dart:io';
void main() {
// Đọc đầu vào
String? username = stdin.readLineSync();
String? email = stdin.readLineSync();
String? age = stdin.readLineSync();
String? password = stdin.readLineSync();
print("Account Validation System");
print("=========================");
try {
// TODO: Tạo hàm (function) validateUsername và gọi hàm tại đây
print("Validating username: $username");
// TODO: Tạo hàm validateEmail và gọi hàm tại đây
print("Validating email: $email");
// TODO: Tạo hàm validateAge và gọi hàm tại đây
print("Validating age: $age");
// TODO: Tạo hàm validatePassword và gọi hàm tại đây
print("Validating password: $password");
// TODO: Nếu tất cả bước kiểm tra đều đạt, in ra thông báo thành công
print("=========================");
print("All validations passed successfully!");
print("Account created for user: $username");
} catch (e) {
// TODO: Xử lý ngoại lệ và in ra thông báo lỗi
print("Validation Error: $e");
print("Account creation failed due to validation errors");
}
}
// TODO: Viết các hàm kiểm tra tại đâyBà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 điều khiển
1Thao tác nâng cao với danh sách
Thuộc tính danh sách: đầu và cuốiTrạng thái danh sách: isEmpty và isNotEmpĐảo ngược danh sáchThêm vào danh sách: insertXóa khỏi danh sách: removeWhereTìm trong danh sách: indexOfSắp xếp danh sáchXáo trộn danh sáchÔn tập: trình sắp xếp danh sách4Thao tác nâng cao với Map
Duyệt qua MapKiểm tra khóa và giá trịCác thuộc tính của Map: khóa và giá trịThêm có điều kiện: putIfAbsentXóa mục khỏi MapMap lồng nhauÔn tập: Cập nhật kho hàng2Thao tác hàm trên danh sách
Biến đổi bằng 'map'Lọc bằng 'where'Dùng '.toList()'Kiểm tra điều kiện bằng 'any'Điều kiện với 'every'Tìm phần tử bằng 'firstWhere'Ôn tập: lọc dữ liệu5Dự án: Tính tiền giỏ hàng
Thiết lập dự ánThêm mặt hàng vào giỏ8Dự án: Trình phân tích văn bản đơn giản
Tổng quan và thiết lập dự ánĐếm ký tự3Tập hợp
Tập hợp là gì?Tạo tập hợpThêm và xóa phần tử khỏi tập hợpKiểm tra phần tử trong tập hợpChuyển danh sách thành tập hợpPhép hợp của các tập hợpPhép giao của các tập hợpPhép hiệu của các tập hợpÔn tập: danh sách khách mời không trùng lặp6Xử lý lỗi cơ bản
Ngoại lệ là gì?Khối lệnh 'try-catch'Bắt ngoại lệ bằng 'on'Khối lệnh 'finally'Ném ngoại lệÔn tập: phép chia an toànTự luyện tập: Trình biên dịch Dart online