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

优化Flutter中Dio异常处理:如何返回更具体的错误提示?

优化Dio错误处理,提供更具体的错误提示

针对你当前的错误处理逻辑,可从以下几个方向优化,让用户获得更精准的错误提示:

1. 细化badResponse类型的错误提示

badResponse对应HTTP状态码非2xx的请求(比如400参数错误、401未授权、500服务端错误等),可以根据状态码给出针对性提示,同时提取服务端返回的自定义错误信息。

2. 补充其他错误类型的具体场景描述

把模糊的"Unexpected error occured"替换为用户能理解的具体场景,比如证书错误、网络连接失败等。

3. 处理非Dio类异常的具体情况

对格式解析错误、业务逻辑异常等非Dio异常,单独给出对应提示。

修改后的错误处理代码

static String handleError(error) {
  String errorDescription = '';
  if (error is DioException) {
    final dioError = error;
    switch (dioError.type) {
      case DioExceptionType.cancel:
        errorDescription = '请求已取消';
        break;
      case DioExceptionType.connectionTimeout:
        errorDescription = '连接服务器超时,请稍后重试';
        break;
      case DioExceptionType.unknown:
        // 区分网络不可用的场景
        if (dioError.error is SocketException) {
          errorDescription = '网络连接失败,请检查你的网络设置';
        } else {
          errorDescription = '未知错误,请稍后重试';
        }
        break;
      case DioExceptionType.receiveTimeout:
        errorDescription = '接收服务器响应超时';
        break;
      case DioExceptionType.badResponse:
        final statusCode = dioError.response?.statusCode;
        // 优先取服务端返回的自定义错误消息
        final serverMessage = dioError.response?.data?['message'] ?? 
                               dioError.response?.data?['error'] ?? '';
        
        switch (statusCode) {
          case 400:
            errorDescription = serverMessage.isNotEmpty ? serverMessage : '请求参数错误,请检查输入';
            break;
          case 401:
            errorDescription = '登录已过期,请重新登录';
            break;
          case 403:
            errorDescription = '你没有权限执行此操作';
            break;
          case 404:
            errorDescription = '请求的资源不存在';
            break;
          case 500:
            errorDescription = serverMessage.isNotEmpty ? serverMessage : '服务器内部错误,请稍后重试';
            break;
          case 502:
            errorDescription = '服务器网关错误';
            break;
          case 503:
            errorDescription = '服务器维护中,请稍后再试';
            break;
          default:
            errorDescription = serverMessage.isNotEmpty ? serverMessage : '请求失败,状态码:$statusCode';
        }
        break;
      case DioExceptionType.sendTimeout:
        errorDescription = '向服务器发送数据超时';
        break;
      case DioExceptionType.badCertificate:
        errorDescription = '证书验证失败,请检查网络环境';
        break;
      case DioExceptionType.connectionError:
        errorDescription = '网络连接失败,请检查你的网络';
        break;
    }
  } else if (error is FormatException) {
    errorDescription = '数据解析错误';
  } else {
    // 非Dio异常直接展示具体信息,避免笼统提示
    errorDescription = error.toString().isNotEmpty ? error.toString() : '发生未知错误';
  }
  return errorDescription;
}

关键优化点

  • badResponse精准处理:按HTTP状态码分类提示,优先使用服务端返回的自定义错误信息,兼顾通用性和业务个性化;
  • 异常场景细分:对unknown类型进一步判断是否是网络不可用,对非Dio异常单独处理格式解析错误;
  • 提示语具象化:所有错误提示都替换为用户能快速理解的场景描述,去掉模糊的通用表述。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 18:43:37