使用Typescript重构axios(十)——异常处理:增强版
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
,错误代码 code
,XMLHttpRequest
对象实例 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
类,添加了一些自己的属性:config
、code
、request
、response
、isAxiosError
等属性。除此之外,我们还创建了一个用于快速创建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,异常处理这块我们就已经搞定了!
(完)
原文地址:https://www.cnblogs.com/wangjiachen666/p/11279283.html
- 【AngularJS】—— 3 我的第一个AngularJS小程序
- 【Spring实战】—— 2 构造注入
- 共享单车运维“朋友圈”越来越宽,乱停乱放现象有望改善吗?
- 【Spring实战】—— 15 Spring JDBC模板使用
- 前端开发总览
- 【Spring实战】—— 16 基于JDBC持久化的事务管理
- 【Spring实战】—— 4 Spring中bean的init和destroy方法讲解
- 基于AngularJS的过滤与排序
- 【Spring实战】—— 5 设值注入
- 科学家预测:未来100万年人类将变成半机械人类
- 【Spring实战】—— 8 自动装配
- 【Spring实战】—— 7 复杂集合类型的注入
- 【Spring实战】—— 6 内部Bean
- 几款可替代Dreamweaver的HTML5开发工具
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(二.创建CI持续集成管道)
- 这样的奇技淫巧,劝你不用也罢
- 我服务又双叒叕奔溃了,含泪干货分享
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)
- Android数据库高手秘籍(十二),LitePal的索引功能
- 使用pm2管理go应用进程
- 用Docker搭建Redis主从复制的集群
- IDEA 非常重要的一些设置项 → 一连串的问题差点让我重新用回 Eclipse !
- ArrayList源码分析(基于jdk1.8)(二):subList陷阱补充
- Windows10中安装Docker
- Windows下Docker安装ClickHouse
- ArrayList源码分析(基于jdk1.8)(三):Arrays.asList方法带来的问题
- 对基本类型包装类常量池的补充
- 与IntegerCache有关的一个比较坑的面试题
- C# Foreach循环本质与枚举器