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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:11:02