You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 21:30:03