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.
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.
- Đọ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") - Đọc một đầu vào dạng chuỗi, biểu thị giá trị thứ nhất
- Đọc một đầu vào dạng chuỗi, biểu thị giá trị thứ hai (nếu có)
- 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ằngint.parse()và chỉ bắtFormatException - 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ắtFormatExceptionnế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ắtRangeErrornếu chỉ số không hợp lệ - 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: 42Nế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 integerNế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: 5Nế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 numbersNế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 0Chươ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
}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
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