1. 什么是HTTP请求异常
HTTP 请求异常指的是 HTTP 请求失败 或者 HTTP 请求返回的状态码非0的情况,主要指的是 AJAX 或者 Fetch API的 HTTP 请求
2. 代码模拟
(1)Ajax 请求报错 但是没有捕获 unhandledrejection
var oButton = document.getElementById('button')
oButton.onclick = function () {
new Promise((resolve, reject) => {
console.log(window.a.test)
})
}window 上没有 a 所以会报错
window.addEventListener('unhandledrejection', (err) => {
console.log(err)
})
自定义上报日志格式 & 数据处理:
window.addEventListener('unhandledrejection', (err) => {
const { reason, type, timeStamp} = err
let error = reason.message
let stack = reason.stack.match(/at\s+.+:(\d+):(\d+)/) // 正则匹配
let log = {
type,
error,
timeStamp,
fileName: stack[0],
position: `${stack[1]}: ${stack[2]}`
}
console.log(log)
// 拿到 log 后进行上报
})日志处理之后的格式:

(2)请求报错
var oButton = document.getElementById('button')
oButton.onclick = function () {
new Promise((resolve, reject) => {
setTimeout(() => {
let errorMessage = {
status: 500,
message: 'server error'
}
resolve(errorMessage)
}, 2000)
}).then((res) => {
console.log(res)
}).catch((err) => {
console.log(err)
// {status: 500, message: 'server error'}
// 对error 进行上报
})
}对于 slardar 、sentry 等监控工具,原理是
对原生的 XMLHttpRequest 对象和 fetch 方法进行重写,从而在代理对象或方法中实现状态码的监听和错误的上报。他们的格式:
{
type: 'ajax';
status: string; // 状态码, 例如 '200'
type: string; // 请求方法, 例如 'POST'
duration: number; // 请求耗时, 例如 125,单位 ms
size: number; // 请求返回 body 大小, 例如 243, 单位 byte
response_header: string; // 响应头
request_header: string; // 请求头
}版权声明:本文为Luckyzhoufangbing原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。