Flutter项目中如何仅重构API调用try-catch的重复catch块
Flutter 通用API异常处理重构方案
你可以通过封装通用异常处理高阶函数的方式实现,完全保留原有try块的业务逻辑不变,仅把异常处理逻辑统一收敛到公共函数中维护。
实现步骤
1. 封装统一异常处理函数
根据你的API调用是异步还是同步,对应封装泛型处理函数:
import 'package:flutter/foundation.dart'; // 异步API调用通用处理(绝大多数场景用这个) Future<T?> runApiCall<T>(Future<T> Function() apiCall) async { try { // 执行传入的原try块内的逻辑 return await apiCall(); } on ResourceNotFoundException { // 统一处理资源不存在异常 handleResourceNotFoundException(); } on NetworkException { // 统一处理网络异常 handleNetworkException(); } // 可继续扩展其他需要统一处理的异常类型 catch (e) { // 兜底异常处理逻辑 debugPrint("接口调用未知异常: $e"); showCommonErrorToast("请求失败,请稍后重试"); } return null; } // 同步API调用通用处理(如果你的API是同步调用用这个) T? runSyncApiCall<T>(T Function() apiCall) { try { return apiCall(); } on ResourceNotFoundException { handleResourceNotFoundException(); } on NetworkException { handleNetworkException(); } catch (e) { debugPrint("接口调用未知异常: $e"); showCommonErrorToast("请求失败,请稍后重试"); } return null; }
2. 替换原有代码
原有try-catch块只需要做极小改动,完全保留原try块内的业务逻辑:
// 改造前的代码 // try { // _userData = apiService.call("user_data"); // } on ResourceNotFoundException { // handleResourceNotFoundException(); // } on NetworkException { // handleNetworkException(); // } // 改造后的代码,原apiService.call逻辑完全不变 _userData = await runApiCall(() => apiService.call("user_data"));
扩展兼容特殊场景
如果部分接口需要单独处理某类异常,不需要走通用逻辑,可以给通用函数增加可选回调参数:
Future<T?> runApiCall<T>( Future<T> Function() apiCall, { // 可选的自定义异常处理回调,不传就走通用逻辑 Function(ResourceNotFoundException)? onResourceNotFound, Function(NetworkException)? onNetworkError, }) async { try { return await apiCall(); } on ResourceNotFoundException catch (e) { onResourceNotFound?.call(e) ?? handleResourceNotFoundException(); } on NetworkException catch (e) { onNetworkError?.call(e) ?? handleNetworkException(); } catch (e) { debugPrint("接口调用未知异常: $e"); showCommonErrorToast("请求失败,请稍后重试"); } return null; } // 特殊场景调用示例 _userData = await runApiCall( () => apiService.call("user_data"), onResourceNotFound: (e) { // 单独处理该接口的资源不存在异常 navigateToNotFoundPage(); }, );
方案优势
- 原有业务逻辑零修改:try块内的代码完全保留,不需要调整原有业务流程
- 异常逻辑统一维护:后续新增异常类型、修改异常处理规则只需要改公共函数一处,不用逐行修改所有try-catch
- 适配性强:支持泛型返回值,兼容同步、异步调用,也支持自定义异常处理的特殊场景
内容的提问来源于stack exchange,提问作者Heikkisorsa
相关产品推荐
相关产品推荐

