Menu
CoddyTech

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.

challenge icon

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.

  1. Đọc một chuỗi đầu vào đại diện cho tên người dùng
  2. Đọc một chuỗi đầu vào đại diện cho địa chỉ email
  3. Đọc một chuỗi đầu vào đại diện cho tuổi
  4. Đọc một chuỗi đầu vào đại diện cho mật khẩu
  5. 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"
  6. 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"
  7. 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"
  8. 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"
  9. Gọi lần lượt từng hàm kiểm tra và xử lý mọi ngoại lệ phát sinh
  10. 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: john

Nế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 errors

Nế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 errors

Chươ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 đây
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 điều khiển

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