- try-catch:
- 适用场景:适用于在异步函数内部处理可预期的错误。比如在
Future
执行的函数体中,当你知道某些操作可能会抛出特定类型的错误时,使用try-catch
块可以捕获并处理这些错误。例如在网络请求时可能因为网络问题抛出异常,就可以在try-catch
块中处理。示例代码如下:
Future<void> fetchData() async {
try {
// 模拟网络请求
var response = await http.get(Uri.parse('https://example.com/api/data'));
// 处理响应数据
} catch (e) {
// 处理网络请求错误
print('网络请求出错: $e');
}
}
- Future.error 与 catchError:
- 适用场景:适用于在
Future
链中统一处理错误。当你有一系列由Future
组成的操作链时,使用catchError
可以在链的末尾统一捕获并处理在Future
执行过程中抛出的错误。例如在一系列文件读取、数据解析等异步操作组成的流程中,使用catchError
可以集中处理各个步骤可能出现的错误。示例代码如下:
Future<String> readFile() {
return Future.error('文件读取错误');
}
void main() {
readFile()
.then((value) => print('文件内容: $value'))
.catchError((e) => print('捕获到错误: $e'));
}
- ErrorWidget.builder:
- 适用场景:在Flutter UI构建过程中,如果异步操作导致UI渲染出错,例如加载图片失败等情况,可以通过
ErrorWidget.builder
来全局设置一个通用的错误显示Widget。这样当任何地方因为异步操作导致UI渲染错误时,都会显示你设置的错误Widget。例如在MaterialApp
中设置:
void main() {
runApp(MaterialApp(
title: 'Flutter Demo',
errorWidget: (BuildContext context, Object error, StackTrace? stackTrace) {
return Center(
child: Text('出现错误: $error'),
);
},
home: MyHomePage(),
));
}