Flutter异常捕获
封面图
•
2025-10-07
•
Flutter
0
0
0
0
在 Flutter 中,**异常捕获(Exception Handling)** 是确保应用稳定性和用户体验的重要部分。Flutter 提供了多种方式来捕获和处理运行时的异常,包括使用 `try-catch` 块、`Zone` 捕获未处理的异常,以及使用 `FlutterError` 处理框架级别的错误。 --- ## 一、基本的异常捕获:`try-catch` ```dart void fetchData() async { try { // 可能抛出异常的代码 var data = await someAsyncFunction(); print('Data: $data'); } on Exception catch (e) { print('Caught an exception: $e'); } catch (e) { print('Unknown error: $e'); } } ``` - `on Exception`:只捕获 `Exception` 类型的异常。 - `catch`:捕获所有其他类型的异常(如 `Error`)。 --- ## 二、处理异步代码中的异常 ```dart Future<void> fetchUserData() async { try { final response = await http.get(Uri.parse('https://api.example.com/data')); if (response.statusCode != 200) { throw Exception('Failed to load data'); } print(response.body); } on Exception catch (e) { print('Error fetching user data: $e'); } } ``` --- ## 三、全局异常捕获(未处理的异常) 在 Flutter 应用中,有些异常可能没有被显式捕获,比如: - 异步操作中未处理的异常 - UI 渲染错误(如 `setState` 在非活跃 widget 中调用) - 其他框架内部错误 ### 1. 使用 `runApp()` 包装器捕获全局异常 ```dart void main() { runApp( // 使用自定义的 runApp 函数来捕获未处理的异常 MyApplication(), ); } class MyApplication extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter App', home: MyHomePage(), ); } } ``` ### 2. 使用 `Zone` 捕获未处理的异常(推荐) ```dart void main() { WidgetsFlutterBinding.ensureInitialized(); // 使用 Zone 捕获所有未处理的异常 runZonedGuarded(() { runApp(MyApp()); }, (error, stackTrace) { print('Uncaught error: $error'); print('Stack trace: $stackTrace'); }); } ``` - `runZonedGuarded()` 是 Flutter 推荐的方式,用于捕获未处理的异常。 - 它可以捕获: - 同步异常 - 异步异常(如 Future 的异常) - UI 渲染错误(如 `setState` 调用在已销毁的 widget 上) --- ## 四、捕获 Flutter 框架内部的错误(如 `FlutterError`) Flutter 会通过 `FlutterError` 报告一些框架级错误(如布局错误、渲染错误等)。你可以通过以下方式捕获这些错误: ```dart void main() { WidgetsFlutterBinding.ensureInitialized(); // 设置 FlutterError 的回调 FlutterError.onError = (details) { FlutterError.presentError(details); print('Flutter error: ${details.exception}'); }; runApp(MyApp()); } ``` --- ## 五、捕获 Dart SDK 内部的错误(如 `Error`) Dart 中的 `Error` 和 `Exception` 是不同的类型: - `Exception`:可恢复的异常(通常由 `throw` 抛出) - `Error`:不可恢复的错误(如内存溢出、栈溢出等) 如果你希望捕获 `Error`,可以在 `catch` 中添加: ```dart try { // ... } on Exception catch (e) { // 处理 Exception } on Error catch (e) { // 处理 Error } ``` --- ## 六、使用 `FlutterErrorDetails` 打印详细错误信息 在调试过程中,可以使用 `FlutterErrorDetails` 来获取更详细的错误信息: ```dart FlutterError.onError = (details) { FlutterError.presentError(details); print('Flutter error details: ${details.exceptionAsString()}'); }; ``` --- ## 七、测试异常捕获 你可以编写单元测试来验证异常是否被捕获: ```dart test('Test exception handling', () { expect(() => throw Exception('Test error'), throwsException); }); ``` --- ## 总结 | 方法 | 用途 | |------|------| | `try-catch` | 捕获同步或异步代码中的异常 | | `runZonedGuarded()` | 捕获全局未处理的异常 | | `FlutterError.onError` | 捕获 Flutter 框架内部错误 | | `on Error` | 捕获不可恢复的错误(如 `Error`) | --- 如果你有具体的异常场景(比如网络请求失败、UI 渲染错误、异步任务异常等),欢迎告诉我,我可以提供更针对性的解决方案。
上一篇:
Flutter 使用WebSockets
下一篇:
Flutter 导航返回拦截(WillPopScope)
标题录入,一次不能超过6条
返回顶部
留言
留言
评论