Dart Future:等待任务结果并逐条处理异常
通过异步函数模拟任务加载,使用 await 和 try/catch 控制顺序,并明确模拟逻辑与真实网络请求的边界。
本节目标
通过异步函数模拟任务加载,使用 await 和 try/catch 控制顺序,并明确模拟逻辑与真实网络请求的边界。
环境与运行方法
安装 Dart SDK 3.x,将源码保存为 lesson.dart,先执行 dart analyze lesson.dart,再执行 dart run lesson.dart。以下为纯 Dart 控制台示例,不依赖 Flutter。
核心思路
返回 Future 的函数表示结果可能稍后可用。await 获得成功值,失败则在等待处表现为异常。本例主动创建确定性成功和失败,不依赖网络,便于验证控制流。
完整示例
Future<String> loadTask(int id) async {
if (id <= 0) throw ArgumentError('invalid id');
return 'task-$id';
}
Future<void> main() async {
for (final id in [1, 0, 2]) {
try {
print(await loadTask(id));
} on ArgumentError {
print('invalid');
}
}
}预期输出
task-1
invalid
task-2逐步理解
main 本身返回 Future<void>,循环逐个等待,因此输出顺序固定。错误捕获位于循环内部,第二项失败不会阻止第三项。只捕获预期的 ArgumentError,其他未知错误不会被无声吞掉。
并发加载可以使用 Future.wait,但应明确部分失败、并发数量与取消策略。此示例没有真实 I/O,因此不能作为请求超时或网络重试功能的实现。把异步语法与具体业务可靠性要求分开理解。
常见问题与边界
- 不 await 就可能处理到 Future 对象而非结果。
- 把异常捕获放在整个循环外会改变后续执行行为。
- async 不代表自动使用独立线程。
动手练习
使用 [0,0,3] 作为输入。
参考答案
依次输出 invalid、invalid、task-3。每个等待点分别处理失败,输入顺序与输出顺序一致。
文章回复
0 条公开回复