Khối lệnh 'finally'
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 41 trên 65.
Đôi khi bạn cần code luôn chạy bất kể điều gì xảy ra trong khối try-catch. Khối finally có tác dụng này: khối này chứa code luôn được thực thi, dù có xảy ra ngoại lệ hay không.
Khối finally nằm sau các khối try và catch. Ngay cả khi code chạy thành công trong phần try, hoặc khi chương trình bắt và xử lý ngoại lệ, khối finally vẫn sẽ chạy.
try {
// Đoạn code có thể gây ra ngoại lệ (exception)
int result = 10 ~/ 2;
print("Result: $result");
} catch (e) {
print("An error occurred: $e");
} finally {
print("This always runs!");
}Điều này khiến khối finally rất phù hợp để thực hiện các thao tác dọn dẹp như đóng tệp, giải phóng tài nguyên hoặc ghi nhật ký rằng một thao tác đã hoàn tất. Dù việc xử lý lỗi diễn ra thế nào, bạn vẫn có thể đảm bảo rằng một số đoạn code nhất định sẽ luôn chạy.
Thử thách
DễTạo một chương trình minh họa khối finally bằng cách triển khai trình mô phỏng xử lý tệp, luôn thực hiện các thao tác dọn dẹp bất kể có xảy ra lỗi trong quá trình xử lý hay không.
- Đọc một đầu vào chuỗi đại diện cho tên tệp cần xử lý
- Đọc một đầu vào chuỗi đại diện cho nội dung tệp
- Đọc một đầu vào chuỗi cho biết có mô phỏng lỗi hay không (
"error"hoặc"success") - Dùng cấu trúc
try-catch-finallyđể mô phỏng việc xử lý tệp: - Trong khối
try: Kiểm tra xem đầu vào mô phỏng lỗi có phải là"error"hay không. Nếu đúng, hãy ném một ngoại lệ có thông báo"File processing failed", nếu không thì xử lý tệp thành công - Trong khối
catch: Xử lý mọi ngoại lệ xảy ra trong quá trình xử lý - Trong khối
finally: Luôn thực hiện các thao tác dọn dẹp bất kể thành công hay thất bại - Hiển thị kết quả xử lý theo đúng định dạng bên dưới
Ví dụ, nếu đầu vào là "document.txt", "Hello World", "success", chương trình của bạn sẽ in ra:
File Processing System
======================
Opening file: document.txt
File content: Hello World
Processing file successfully...
File processed: 11 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfullyNếu đầu vào là "report.pdf", "Annual Report Data", "error", chương trình của bạn sẽ in ra:
File Processing System
======================
Opening file: report.pdf
File content: Annual Report Data
Error occurred: File processing failed
Unable to complete file processing
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed with errorsNếu đầu vào là "config.json", "{\"setting\": \"value\"}", "success", chương trình của bạn sẽ in ra:
File Processing System
======================
Opening file: config.json
File content: {"setting": "value"}
Processing file successfully...
File processed: 20 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfullyChương trình của bạn phải dùng cấu trúc try-catch-finally, trong đó khối finally luôn thực hiện ba thao tác dọn dẹp theo đúng thứ tự bên dưới. Trong khối try, hãy kiểm tra xem đầu vào mô phỏng lỗi có bằng "error" hay không và ném ngoại lệ nếu đúng. Nếu không mô phỏng lỗi, hãy đếm số ký tự trong nội dung tệp bằng thuộc tính length. Khối finally luôn in các thông báo dọn dẹp và xác định trạng thái hoàn tất cuối cùng dựa trên việc có xảy ra lỗi hay không.
Tự làm thử
import 'dart:io';
void main() {
// Đọc đầu vào (input)
String? filename = stdin.readLineSync();
String? content = stdin.readLineSync();
String? errorSimulation = stdin.readLineSync();
// Hiển thị tiêu đề hệ thống
print("File Processing System");
print("======================");
print("Opening file: $filename");
print("File content: $content");
// TODO: Viết code bên dưới
// Dùng cấu trúc try-catch-finally để mô phỏng việc xử lý tệp (file)
// Trong khối lệnh (block) try: kiểm tra errorSimulation có bằng "error" không và ném ngoại lệ (exception) nếu đúng
// Trong khối catch: xử lý mọi ngoại lệ
// Trong khối finally: luôn thực hiện các thao tác dọn dẹp
}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