为何Future.wait抛出的错误在流处理场景下无法被try-catch捕获?
问题核心原因
第一个代码中addItem的错误无法被捕获,本质是异步任务的错误未被及时等待,导致变成未捕获异常终止程序:
- 在
await for循环处理流元素时,每次调用executor.submit(() => demoMethod())都会立即执行demoMethod(),返回的Future被加入Executor的任务列表,但此时main函数还在执行await for循环,尚未调用await executor.execute()等待这些Future完成。 - 当
demoMethod内部的await executor.execute()抛出错误时,对应的Future进入error状态,但此时没有任何代码在等待这个Future(main还没到await executor.execute()步骤),错误直接变成未捕获的异步异常,程序会直接终止,main中的try-catch块根本没机会执行。
而第二个代码的普通for循环会一次性提交所有任务,随后立刻调用await executor.execute(),所有任务的Future被Future.wait统一等待,错误会被Future.wait捕获并抛出,最终被main的catch块处理。
解决方案
方案1:给单个任务添加错误处理
在提交任务时,为demoMethod的Future添加错误处理,避免未捕获异常:
executor.submit(() => demoMethod().catchError((e) { print('任务执行出错:$e'); }));
方案2:修改Executor的任务执行逻辑
让Executor保存任务函数而非立即执行,等到execute()调用时再统一执行所有任务,确保所有错误都被Future.wait捕获:
class Executor { final List<Future<void> Function()> _tasks = []; bool _disposed = false; void submit(Future<void> Function() computation) { if (!_disposed) { _tasks.add(computation); // 仅保存任务函数,不立即执行 } else { throw Exception('Executor is already disposed'); } } Future<void> execute() async { // 统一执行所有任务并等待结果 await Future.wait(_tasks.map((task) => task()), eagerError: true); _disposed = true; } }
修改后,await for循环提交任务时不会触发demoMethod()执行,直到await executor.execute()调用时才统一启动所有任务,错误会被Future.wait捕获并传递到main的catch块。
内容的提问来源于stack exchange,提问作者Anindya Chatterjee
相关产品推荐
相关产品推荐

