Menu
CoddyTech

finally 代码块

本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 41 课,共 65 课。

有时,你需要一段无论 try-catch 块中发生什么都会运行的代码。finally 块正是为此而设计的,其中的代码无论是否发生异常都会执行。

finally 块位于 try 和 catch 块之后。即使你的代码在 try 部分成功运行,或者异常被捕获并处理,finally 块仍会执行。

try {
  // 可能引发异常的代码
  int result = 10 ~/ 2;
  print("Result: $result");
} catch (e) {
  print("An error occurred: $e");
} finally {
  print("This always runs!");
}

这使得 finally 块非常适合执行清理操作,例如关闭文件、释放资源,或记录操作已完成。无论错误处理过程中发生什么,你都可以确保某些代码始终会运行。

challenge icon

挑战

简单

创建一个程序,通过实现文件处理模拟器来演示 finally 代码块。无论处理过程中是否发生错误,程序都会执行清理操作。

  1. 读取一个表示要处理的文件名的字符串输入
  2. 读取一个表示文件内容的字符串输入
  3. 读取一个表示是否模拟错误的字符串输入("error" 或 "success")
  4. 使用 try-catch-finally 结构模拟文件处理:
    • 在 try 代码块中:检查错误模拟输入是否为 "error"。如果是,则抛出一条消息为 "File processing failed" 的异常;否则,成功处理文件
    • 在 catch 代码块中:处理处理过程中发生的任何异常
    • 在 finally 代码块中:无论成功还是失败,都执行清理操作
  5. 按照下面所示的准确格式显示处理结果

例如,如果输入为 "document.txt"、"Hello World"、"success",程序应输出:

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

如果输入为 "report.pdf"、"Annual Report Data"、"error",程序应输出:

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

如果输入为 "config.json"、"{\"setting\": \"value\"}"、"success",程序应输出:

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

你的程序必须使用 try-catch-finally 结构,并确保 finally 代码块始终按所示的准确顺序执行三项清理操作。在 try 代码块中,检查错误模拟输入是否等于 "error",如果是,则抛出异常。如果没有模拟错误,则使用 length 属性计算文件内容中的字符数。finally 代码块应始终输出清理消息,并根据是否发生错误确定最终完成状态。

亲手试试

import 'dart:io';

void main() {
  // 读取输入
  String? filename = stdin.readLineSync();
  String? content = stdin.readLineSync();
  String? errorSimulation = stdin.readLineSync();
  
  // 显示系统标题
  print("File Processing System");
  print("======================");
  print("Opening file: $filename");
  print("File content: $content");
  
  // TODO: 在下方编写你的代码
  // 使用 try-catch-finally 结构模拟文件处理
  // 在 try 代码块中:检查 errorSimulation 是否等于 "error",如果是,就抛出异常
  // 在 catch 代码块中:处理任何异常
  // 在 finally 代码块中:始终执行清理操作
  
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程控制中的所有课

自己练习: Dart 在线编译器