Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 561|回复: 0

使用Typescript重构axios(十)——异常处理:增强版

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-9-6 17:36:44 | 显示全部楼层 |阅读模式

    0. 系列文章

    1.使用Typescript重构axios(一)——写在最前面
    2.使用Typescript重构axios(二)——项目起手,跑通流程
    3.使用Typescript重构axios(三)——实现基础功能:处理get请求url参数
    4.使用Typescript重构axios(四)——实现基础功能:处理post请求参数
    5.使用Typescript重构axios(五)——实现基础功能:处理请求的header
    6.使用Typescript重构axios(六)——实现基础功能:获取响应数据
    7.使用Typescript重构axios(七)——实现基础功能:处理响应header
    8.使用Typescript重构axios(八)——实现基础功能:处理响应data
    9.使用Typescript重构axios(九)——异常处理:基础版
    10.使用Typescript重构axios(十)——异常处理:增强版
    11.使用Typescript重构axios(十一)——接口扩展
    12.使用Typescript重构axios(十二)——增加参数
    13.使用Typescript重构axios(十三)——让响应数据支持泛型
    14.使用Typescript重构axios(十四)——实现拦截器
    15.使用Typescript重构axios(十五)——默认配置
    16.使用Typescript重构axios(十六)——请求和响应数据配置化
    17.使用Typescript重构axios(十七)——增加axios.create
    18.使用Typescript重构axios(十八)——请求取消功能:总体思路
    19.使用Typescript重构axios(十九)——请求取消功能:实现第二种使用方式
    20.使用Typescript重构axios(二十)——请求取消功能:实现第一种使用方式
    21.使用Typescript重构axios(二十一)——请求取消功能:添加axios.isCancel接口
    22.使用Typescript重构axios(二十二)——请求取消功能:收尾
    23.使用Typescript重构axios(二十三)——添加withCredentials属性
    24.使用Typescript重构axios(二十四)——防御XSRF攻击
    25.使用Typescript重构axios(二十五)——文件上传下载进度监控
    26.使用Typescript重构axios(二十六)——添加HTTP授权auth属性
    27.使用Typescript重构axios(二十七)——添加请求状态码合法性校验
    28.使用Typescript重构axios(二十八)——自定义序列化请求参数
    29.使用Typescript重构axios(二十九)——添加baseURL
    30.使用Typescript重构axios(三十)——添加axios.getUri方法
    31.使用Typescript重构axios(三十一)——添加axios.all和axios.spread方法
    32.使用Typescript重构axios(三十二)——写在最后面(总结)

    项目源码请猛戳这里!!!

    1. 前言

    在上篇文章中,我们处理异常时仅仅获取了异常的文本信息,但是对出现异常的请求的详细信息并未获取,我们期望在请求发生异常时我们能获取到该请求的对象配置 config,错误代码 codeXMLHttpRequest 对象实例 request以及响应对象 response,方便用户进行异常定位排查,如下:

    axios({
      method: "get",
      url: "/api/handleError1"
    })
      .then(res => {
        console.log(res);
      })
      .catch(e => {
        console.log(e.message);
        console.log(e.config);
        console.log(e.request);
        console.log(e.code);
      });
    

    那么,接下来,我们就来增强异常信息。

    2. 异常信息接口类型定义

    根据我们所要获取的几个异常信息,我们先在src/types.index.ts中定义一下异常信息的接口类型,如下:

    export interface AxiosError extends Error {
      config: AxiosRequestConfig;
      code?: string | null | number;
      request?: any;
      response?: AxiosResponse;
    }
    

    3. 创建AxiosError类

    定义好接口类型以后,我们就来创建一个AxiosError类,该类继承自内置的Error类,我们在src/helpers路径下创建error.ts文件,如下:

    // src/helpers/error.ts
    
    import { AxiosRequestConfig, AxiosResponse } from "../types";
    
    export class AxiosError extends Error {
      private config: AxiosRequestConfig;
      private request?: any;
      private code?: string | null | number;
      private response?: AxiosResponse;
        
      constructor(
        message: string,
        config: AxiosRequestConfig,
        request?: any,
        code?: string | null | number,
        response?: AxiosResponse
      ) {
        super(message);
    
        this.config = config;
        this.request = request;
        this.code = code;
        this.response = response;
    
        Object.setPrototypeOf(this, AxiosError.prototype);
      }
    }
    
    export function createError(
      message: string,
      config: AxiosRequestConfig,
      code: string | null | number,
      request?: any,
      response?: AxiosResponse
    ) {
      const error = new AxiosError(message, config, code, request, response);
      return error;
    }
    
    

    AxiosError 类继承于 Error 类,添加了一些自己的属性:configcoderequestresponseisAxiosError 等属性。除此之外,我们还创建了一个用于快速创建AxiosError 类实例的工厂方法createError,后续我们可以直接调用该方法,并传入相关的参数来快速创建AxiosError 类实例。

    OK,定义好之后我们就可以使用一下。

    4. 使用AxiosError类

    AxiosError 类使用起来非常简单,我们只需把上篇文章中在src/xhr.ts中抛出异常的地方的new Error()改成createError就好啦。

    // src/xhr.ts
    
    import { AxiosError } from "./helpers/error";
    
    request.onerror = function() {
        reject(createError(
            "Net Error", 
            config, 
             null,
            request
        ));
    };
    
    request.ontimeout = function() {
        reject(
            createError(
                `Timeout of ${timeout} ms exceeded`,
                config,
               "TIMEOUT",
               request
            )
        );
    };
    
    function handleResponse(response: AxiosResponse): void {
        if (response.status >= 200 && response.status < 300) {
            resolve(response);
        } else {
            reject(
                createError(
                    `Request failed with status code ${response.status}`,
                     config,
                     null,
                     request.status,
                     response
                )
            );
        }
    }
    
    

    改写完成后,我们就可以编写demo来测试一下,看看效果如何。

    5. 编写demo

    上篇文章中的demo我们完全可以复用,只需在异常捕获那里稍加改动,加上我们开头想要获取的几个异常信息打印即可,看看是否能够获取到。

    // examples/handleError/app.ts
    
    axios({
      method: "get",
      url: "/api/handleError1"
    })
      .then(res => {
        console.log(res);
      })
      .catch(e => {
        console.log(e.message);
        console.log(e.config);
        console.log(e.request);
        console.log(e.code);
      });
    

    OK,接下来,我们就可以将项目运行起来,打开 chrome 浏览器,访问 http://localhost:8000/ 即可访问我们的 demo 了,我们点击 handleError,通过F12的控制台我们可以看到:我们想要的异常信息已经可以获取到了。

    OK,异常处理这块我们就已经搞定了!
    (完)

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-20 22:16 , Processed in 0.065351 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表