Dio新版本适配求助:旧版异常处理代码出现DioException报错
Dio 新版本(5.x+)适配DioException错误处理方案
你遇到的报错是因为Dio 5.x版本重构了DioException的结构,原来直接通过switch匹配DioException实例的方式已经失效,现在需要通过DioException.type属性来判断错误类型。以下是适配后的完整代码:
import 'package:dio/dio.dart'; abstract class Failure { final String message; Failure({required this.message}); } class ServerFailure extends Failure { ServerFailure({required super.message}); factory ServerFailure.fromDioException(DioException e) { switch (e.type) { case DioExceptionType.connectionError: return ServerFailure(message: '连接错误'); case DioExceptionType.connectionTimeout: return ServerFailure(message: '连接超时'); case DioExceptionType.receiveTimeout: return ServerFailure(message: '接收超时'); case DioExceptionType.sendTimeout: return ServerFailure(message: '发送超时'); case DioExceptionType.badResponse: if (e.response != null) { return ServerFailure.fromResponse( e.response!.statusCode!, e.response!.data!); } return ServerFailure(message: '响应格式错误'); case DioExceptionType.cancel: return ServerFailure(message: '请求已取消'); case DioExceptionType.unknown: return ServerFailure(message: '未知错误'); default: return ServerFailure(message: '默认错误'); } } // 修正原代码拼写错误:formResponse → fromResponse factory ServerFailure.fromResponse(int statusCode, dynamic response) { if (statusCode == 500) { return ServerFailure(message: '服务器内部错误'); } else if (statusCode == 404) { return ServerFailure(message: '请求资源不存在'); } else if (statusCode == 400 || statusCode == 401 || statusCode == 403) { return ServerFailure( message: '请求错误 $statusCode,响应内容:$response '); } else { return ServerFailure(message: '未知错误'); } } }
关键改动说明
- 错误类型访问方式变更:Dio 5.x将原来的
DioException.connectionError这类枚举实例,改为DioExceptionType枚举,需要通过e.type属性访问 - 枚举名调整:原
requestCancelled改为cancel,新增unknown类型用于处理未归类的错误 - 空安全优化:处理
badResponse时增加e.response非空判断,避免空指针异常 - 笔误修正:原代码中
formResponse是拼写错误,改为正确的fromResponse
如果是从旧版本升级到Dio 5.x,除了错误处理部分,还要同步检查请求/响应拦截器等其他使用DioException的代码,确保全量适配。
内容的提问来源于stack exchange,提问作者Mohamad Adib Tawil
相关产品推荐
相关产品推荐

