Menu
CoddyTech

Bắt ngoại lệ bằng 'on'

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 40 trên 65.

Mặc dù khối try-catch cơ bản bắt mọi ngoại lệ (exception) xảy ra, đôi khi bạn cần xử lý từng loại ngoại lệ theo cách khác nhau. Từ khóa (keyword) on cho phép bạn bắt các loại ngoại lệ cụ thể và đưa ra cách xử lý phù hợp cho từng loại.

Thay vì bắt mọi ngoại lệ bằng catch chung chung, bạn có thể xử lý từng ngoại lệ cụ thể bằng cách dùng on theo sau là kiểu ngoại lệ. Cách này giúp bạn kiểm soát tốt hơn cách chương trình phản hồi với từng tình huống lỗi.

try {
  int number = int.parse("abc");
} on FormatException {
  print("Please enter a valid number");
}

Trong ví dụ này, code chỉ bắt ngoại lệ FormatException, xảy ra khi cố gắng phân tích văn bản không hợp lệ thành số. Nhờ vậy, bạn có thể đưa ra thông báo rõ ràng, thân thiện với người dùng và trực tiếp chỉ ra vấn đề, thay vì hiển thị thông báo lỗi chung chung có thể khiến người dùng bối rối.

Bạn cũng có thể kết hợp nhiều khối on để xử lý các loại ngoại lệ khác nhau bằng những phản hồi phù hợp, giúp việc xử lý lỗi vừa chính xác vừa thân thiện với người dùng.

challenge icon

Thử thách

Dễ

Tạo một chương trình minh họa cách bắt các ngoại lệ cụ thể bằng từ khóa on. Chương trình sẽ xử lý nhiều loại đầu vào khác nhau của người dùng và xử lý các loại ngoại lệ cụ thể bằng thông báo lỗi phù hợp.

  1. Đọc một đầu vào dạng chuỗi, biểu thị loại biểu thức toán học ("parse", "divide" hoặc "access")
  2. Đọc một đầu vào dạng chuỗi, biểu thị giá trị thứ nhất
  3. Đọc một đầu vào dạng chuỗi, biểu thị giá trị thứ hai (nếu có)
  4. Dựa trên loại biểu thức, thực hiện thao tác tương ứng bằng cách xử lý ngoại lệ cụ thể:
    • Với "parse": Chuyển giá trị thứ nhất thành số nguyên bằng int.parse() và chỉ bắt FormatException
    • Với "divide": Phân tích cả hai giá trị thành số nguyên rồi thực hiện phép chia, bắt FormatException nếu có lỗi phân tích
    • Với "access": Tạo một danh sách chứa giá trị thứ nhất và truy cập chỉ số được chỉ định bởi giá trị thứ hai, bắt RangeError nếu chỉ số không hợp lệ
  5. Hiển thị kết quả hoặc thông báo lỗi cụ thể theo đúng định dạng bên dưới

Ví dụ, nếu đầu vào là "parse", "42", "unused", chương trình của bạn sẽ in ra:

Operation: parse
Input: 42
Parsing successful!
Result: 42

Nếu đầu vào là "parse", "xyz", "unused", chương trình của bạn sẽ in ra:

Operation: parse
Input: xyz
FormatException caught: Invalid number format
Please provide a valid integer

Nếu đầu vào là "divide", "10", "2", chương trình của bạn sẽ in ra:

Operation: divide
Values: 10, 2
Division successful!
Result: 5

Nếu đầu vào là "divide", "10", "abc", chương trình của bạn sẽ in ra:

Operation: divide
Values: 10, abc
FormatException caught: Invalid number format
Cannot perform division with invalid numbers

Nếu đầu vào là "access", "hello", "1", chương trình của bạn sẽ in ra:

Operation: access
List: [hello]
Index: 1
RangeError caught: Index out of range
Valid indices are 0 to 0

Chương trình của bạn phải dùng các khối try-catch riêng biệt với từ khóa on để bắt riêng FormatException và RangeError. Mỗi loại ngoại lệ cần có thông báo lỗi phù hợp, giải thích rõ vấn đề đã xảy ra. Với thao tác "access", hãy tạo một danh sách chỉ chứa giá trị đầu vào thứ nhất và thử truy cập chỉ số được chỉ định bởi giá trị đầu vào thứ hai.

Tự làm thử

import 'dart:io';

void main() {
  // Đọc đầu vào
  String? operation = stdin.readLineSync();
  String? firstValue = stdin.readLineSync();
  String? secondValue = stdin.readLineSync();
  
  // Hiển thị thông tin phép toán
  print('Operation: $operation');
  
  // TODO: Viết code bên dưới
  // Dùng các khối try-catch với từ khóa 'on' để xử lý từng loại ngoại lệ
  // Xử lý FormatException cho phép toán parse và divide
  // Xử lý RangeError cho phép toán access
  
}
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