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 块非常适合执行清理操作,例如关闭文件、释放资源,或记录操作已完成。无论错误处理过程中发生什么,你都可以确保某些代码始终会运行。
挑战
简单创建一个程序,通过实现文件处理模拟器来演示 finally 代码块。无论处理过程中是否发生错误,程序都会执行清理操作。
- 读取一个表示要处理的文件名的字符串输入
- 读取一个表示文件内容的字符串输入
- 读取一个表示是否模拟错误的字符串输入(
"error"或"success") - 使用
try-catch-finally结构模拟文件处理: - 在
try代码块中:检查错误模拟输入是否为"error"。如果是,则抛出一条消息为"File processing failed"的异常;否则,成功处理文件 - 在
catch代码块中:处理处理过程中发生的任何异常 - 在
finally代码块中:无论成功还是失败,都执行清理操作 - 按照下面所示的准确格式显示处理结果
例如,如果输入为 "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 代码块中:始终执行清理操作
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器