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

Flutter如何使用try-catch捕获API错误响应实现Toast提示

问题原因
  • 接口返回非201业务错误状态码时,现有代码直接返回null,没有抛出异常,外层try-catch只能捕获断网、超时这类网络层错误,无法拿到业务错误信息。
  • 两层封装的catch逻辑直接返回错误对象,吞掉了异常栈,上层调用方无法通过正常异常捕获流程拿到错误提示。
修复代码

1. 修改Service层逻辑

非201状态码时解析接口返回的错误体,主动抛出带提示文案的异常,不要吞错:

// companyService
Future<Company> createCompany(Company company) async {
  try {
    final content = jsonEncode(company.toJson());
    accessToken = await sharedPref.read(key);
    final requestUrl = "$baseUrl/company";
    final response = await http.post(
      Uri.parse(requestUrl),
      body: content,
      headers: {
        "Content-Type": "application/json",
        "Authorization": "Bearer $accessToken",
      },
    );
    if (response.statusCode == 201) {
      return company;
    }
    // 解析接口返回的错误结构
    final respJson = jsonDecode(response.body);
    // 抛出业务异常,把提示文案带出去
    throw Exception(respJson['message'] ?? '创建失败,请稍后重试');
  } catch (e) {
    // 所有捕获到的错误直接重新抛出,不要return e/return null吞掉
    rethrow;
  }
}

2. 简化Factory层逻辑

去掉无意义的try-catch包装,让异常自然向上透传给页面调用方:

// companyFactory
Future<Company> createCompany(
  String name,
  String domain,
  String address,
  int cityId,
) async {
  final company = Company(
    name: name,
    domain: domain,
    address: address,
    cityId: cityId,
  );     
  final CompanyService service = CompanyService();
  await service.createCompany(company);
  return company;
}

3. 页面调用时捕获异常弹Toast

在提交创建的业务逻辑里,通过try-catch拿到异常后直接展示提示:

// 页面提交按钮点击逻辑
try {
  await companyFactory.createCompany(
    nameInput.text.trim(),
    domainInput.text.trim(),
    addressInput.text.trim(),
    selectedCityId
  );
  // 创建成功逻辑:刷新列表、返回上一页等
  Fluttertoast.showToast(msg: "公司创建成功");
} catch (err) {
  // 去掉Exception前缀后展示错误提示
  final tip = err.toString().replaceFirst('Exception: ', '');
  Fluttertoast.showToast(msg: tip);
}

适配提示:如果你的接口返回的message字段是数组、嵌套对象格式,只需要调整Service层的解析逻辑即可,比如数组类型的message可以用join('、')拼接成完整提示文案。

内容的提问来源于stack exchange,提问作者Emmon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:06:21