Menu
CoddyTech

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.

challenge icon

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.

  1. Đọc một đầu vào chuỗi đại diện cho tên tệp cần xử lý
  2. Đọc một đầu vào chuỗi đại diện cho nội dung tệp
  3. Đọc một đầu vào chuỗi cho biết có mô phỏng lỗi hay không ("error" hoặc "success")
  4. 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
  5. 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 successfully

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

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

Chươ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
  
}
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