优化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
相关产品推荐
相关产品推荐

