前端错误收集与处理

前言

做好错误监控,将用户使用时的错误日志上报,可以帮助我们更快的解决一些问题。

那前端监控是怎么实现的呢?要想了解这个,需要知道前端错误大概分为哪些以及如何捕获处理。

前端错误分为JS运行时错误、资源加载错误和接口错误三种。

本文档介绍有关js的错误类型、错误事件、vue3的app.config.errorHandler全局处理函数。

用nodejs+Express模拟接口,将监听到的错误信息发送到nodejs写的接口里,再通过一个getErrorList接口展示错误信息列表。

js的错误对象和onerror事件

2.1错误对象类型

ECMA-262定义了下列7种错误类型:https://baike.baidu.com/item/ECMAScript/1889420?fr=aladdin

Error() // 基类型

EvalError() // eval错误

RangeError() // 范围错误

ReferenceError() // 引用错误

SyntaxError() // 语法错误

TypeError() // 类型错误

URIError() // URI错误

Error: 所有错误类型的父类型。

SyntaxError: 语法错误,表示程序的语法使用错误。

console.log(【】) ; VM115:1 Uncaught SyntaxError: Invalid or unexpected token

ReferenceError: 引用错误,表示引用的变量不存在。

console.log(a) ; VM274:1 Uncaught ReferenceError: a is not defined at <anonymous>:1:13

TypeError: 类型错误,表示使用了错误的数据类型。

let a;
console.log(a.name); 
VM279:2 Uncaught TypeError: Cannot read properties of undefined (reading 'name')
    at <anonymous>:2:15

RangeError:范围错误, 数据值不在其所允许的范围内(函数递归调用容易出现此错误)。

(10.24).toFixed(-1)
VM363:2 Uncaught RangeError: toFixed() digits argument must be between 0 and 100
    at Number.toFixed (<anonymous>)
    at <anonymous>:2:9

URIError: URI错误,向全局 URI 处理函数(decodeURI、decodeURIComponent)传递一个不合法的URI时,URIError 错误会被抛出。

// 解码URI地址   错误:格式不正确
console.log(decodeURI("%") );
VM368:2 Uncaught URIError: URI malformed
    at decodeURI (<anonymous>)
    at <anonymous>:2:13

EvelError: eval函数执行错误 EvalError 不在当前ECMAScript规范中使用,因此不会被运行时抛出。但是对象本身仍然与规范的早期版本向后兼容。

通过error的构造器可以创建一个错误对象。如 new error() throw new Error(); 这个是创建错误,创造一个错误类型抛出。

 

// 抛出的地方
function parseExcel(con) {
   try {
        // doSomething
    } catch (error) {
        throw new Error('parse excel failed');
    }
}
// 捕获的地方 
try {
    parseExcel(con);
} catch (error) {
    if (error.message === 'parse excel failed') {
        //doSomething
    }
}

2.2Error对象

--error 对象是当错误发生时提供错误信息的 JS 内置对象。

当错误发生时,浏览器会生成 error 对象并抛出,并且中断后面代码的执行。

console.log(js)
console.log('中断后面代码的执行,不会被执行到')
VM488:1 Uncaught ReferenceError: js is not defined
    at <anonymous>:1:13

任何没有通过try-catch处理的错误都会触发window对象的error事件。

error事件接收五个参数:

message:错误信息(字符串)

source:发生错误的脚本URL(字符串)

lineno:发生错误的行号(数字)

colno:发生错误的列号(数字)

error:Error对象(对象)

 

 

图像也支持error事件。

var img = new Image()
img.src='a.jpg'
img.onerror = function(e) {
  console.log(e)
}

2.3资源加载失败

window.addEventListener 当一项资源(如图片或脚本)加载失败,加载资源的元素会触发一个 Event 接口的 error 事件,这些 error 事件不会向上冒泡到 window,但能被捕获。而window.onerror不能监测捕获。

// 图片、script、css加载错误,都能被捕获 ✅
<script>
  window.addEventListener('error', (error) => {
     console.log('捕获到异常:', error);
  }, true)
</script>
<img src="https://yun.tuia.cn/image/kkk.png">
<script src="https://yun.tuia.cn/foundnull.js"></script>
<link href="https://yun.tuia.cn/foundnull.css" rel="stylesheet"/>
  
// new Image错误,不能捕获 ❌
<script>
  window.addEventListener('error', (error) => {
    console.log('捕获到异常:', error);
  }, true)
</script>
<script>
  new Image().src = 'https://yun.tuia.cn/image/lll.png'
</script>

// fetch错误,不能捕获 ❌
<script>
  window.addEventListener('error', (error) => {
    console.log('捕获到异常:', error);
  }, true)
</script>
<script>
  fetch('https://tuia.cn/test')
</script>

到目前为止,还有语法错误、promise异步错误、new Image资源加载错误还没有捕获方法。

语法错误可以在开发阶段依靠编辑器发现。

new Image运用的比较少,可以单独自己处理自己的错误,可以通过img.onerror = fn来单独处理。

但通用的fetch怎么办呢,fetch返回Promise,但Promise的错误不能被捕获,怎么办呢?

Promise错误

1.普通Promise错误

try/catch不能捕获Promise中的错误

// try/catch 不能处理 JSON.parse 的错误,因为它在 Promise 中
try {
  new Promise((resolve,reject) => { 
    JSON.parse('')
    resolve();
  })
} catch(err) {
  console.error('in try catch', err)
}

// 需要使用catch方法
new Promise((resolve,reject) => { 
  JSON.parse('')
  resolve();
}).catch(err => {
  console.log('in catch fn', err)
})

2.async错误

try/catch不能捕获async包裹的错误

const getJSON = async () => {
  throw new Error('inner error')
}

// 通过try/catch处理
const makeRequest = async () => {
    try {
        // 捕获不到
        JSON.parse(getJSON());
    } catch (err) {
        console.log('outer', err);
    }
};

try {
    // try/catch不到
    makeRequest()
} catch(err) {
    console.error('in try catch', err)
}

try {
    // 需要await,才能捕获到
    await makeRequest()
} catch(err) {
    console.error('in try catch', err)
}

3.import chunk错误

import其实返回的也是一个promise,因此使用如下两种方式捕获错误

// Promise catch方法
import(/* webpackChunkName: "incentive" */'./index').then(module => {
    module.default()
}).catch((err) => {
    console.error('in catch fn', err)
})

// await 方法,try catch
try {
    const module = await import(/* webpackChunkName: "incentive" */'./index');
    module.default()
} catch(err) {
    console.error('in try catch', err)
}

小结:全局捕获Promise中的错误

以上三种其实归结为Promise类型错误,可以通过unhandledrejection捕获。 为了防止有漏掉的 Promise 异常,可通过unhandledrejection用来全局监听Uncaught Promise Error。

// 全局统一处理Promise
window.addEventListener("unhandledrejection", function(e){
  console.log('捕获到异常:', e);
});
fetch('https://tuia.cn/test')

当promise被reject并且错误信息没有被处理的时候,会抛出一个unhandledrejection,并且这个错误不会被window.onerror以及window.addEventListener('error')捕获,需要用专门的window.addEventListener('unhandledrejection')捕获处理。

window.addEventListener('unhandledrejection', event => 
    { 
       console.log('unhandledrejection:' + event.reason); // 捕获后自定义处理
    });

https://developer.mozilla.org... 例子: http://sandbox.runjs.cn/show/eatrbc1w 请打开页面打开控制台查看。点击button抛出unhandledrejection错误,并且该错误仅能被window.addEventListener('unhandledrejection')捕获。

Uncaught RangeError: Maximum call stack

这是Chrome浏览器在几种情况下出现的错误,一种是调用不终止的递归函数。你可以在Chrome开发者控制台中对此进行测试。

8、js FileReader 读取文件错误处理

const reader = new FileReader()

reader.onload = ()=>{}

reader.οnerrοr= ()=>{}

9、图片onerror事件

img标签支持onerror 事件,在装载文档或图像的过程中如果发生了错误,就会触发onerror事件。可以使用一张提示错误的图片代替显示不了的图片。

10、其他资源的onerror事件---脚本、iframe等

浏览器允许我们跟踪外部资源的加载 —— 脚本,iframe,图片等。

因此,在 onload 中我们可以使用脚本中的变量,运行函数等。 ……如果加载失败怎么办?例如,这里没有这样的脚本(error 404)或者服务器宕机(不可用)。

发生在脚本加载期间的 error 会被 error 事件跟踪到。

例如,我们请求一个不存在的脚本:

let script = document.createElement('script');
script.src = "https://example.com/404.js"; // 没有这个脚本
document.head.append(script);

script.onerror = function() {
  alert("Error loading " + this.src); // Error loading https://example.com/404.js
};

请注意,在这里我们无法获取更多 HTTP error 的详细信息。我们不知道 error 是 404 还是 500 或者其他情况。只知道是加载失败了。

  • 对于 <iframe> 来说,iframe 加载完成时会触发 iframe.onload 事件,无论是成功加载还是出现 error。

1.5 特别说明sourceMap

在线上由于JS一般都是被压缩或者打包(webpack)过,打包后的文件只有一行,因此报错会出现第一行第5000列出现JS错误,给排查带来困难。sourceMap存储打包前的JS文件和打包后的JS文件之间一个映射关系,可以根据打包后的位置快速解析出对应源文件的位置。

但是出于安全性考虑,线上设置sourceMap会存在不安全的问题,因为网站使用者可以轻易的看到网站源码,此时可以设置.map文件只能通过公司内网访问降低隐患

sourceMap配置devtool: 'inline-source-map' 如果使用了uglifyjs-webpack-plugin 必须把 sourceMap设置为true https://doc.webpack-china.org...icon-default.png?t=N5K3https://doc.webpack-china.org/guides/development/#%E4%BD%BF%E7%94%A8-source-map

三、vue的app.config.errorHandler全局处理函数

由于Vue会捕获所有Vue单文件组件或者Vue.extend继承的代码,所以在Vue里面出现的错误,并不会直接被window.onerror捕获,而是会抛给Vue.config.errorHandler。

app.config.errorHandler用于为应用内抛出的未捕获错误指定一个全局处理函数。 https://cn.vuejs.org/api/application.html#app-config-errorhandler

  • 详细信息

  • 错误处理器接收三个参数:错误对象、触发该错误的组件实例和一个指出错误来源类型信息的字符串。

  • 它可以从下面这些来源中捕获错误:

    • 组件渲染器

    • 事件处理器

    • 生命周期钩子

    • setup() 函数

    • 侦听器

    • 自定义指令钩子

    • 过渡 (Transition) 钩子

import { createApp } from 'vue'
import App from './App.vue'

let app = createApp(App)
app.config.errorHandler = (err, vm, info) => {
    console.log(123)
    // err:
    // vm:
    // info: 是vue特定的错误信息,比如错误所在的生命周期钩子
    console.log(err, vm, info);
    fetch("http://127.0.0.1:8081/process_post", {
        method: "POST",
        headers: {
                "Content-Type": "application/json",
        },
        mode: "no-cors",
        body: JSON.stringify({
                errorMsg: err
        })
    }).then(function(res) {
        if (res.status === 200) {
                return res.json()
        } else {
                //return Promise.reject(res.json())
        }
    }).then(function(data) {
            console.log(data);
    }).catch(function(err) {
            console.log(err);
    });
}
app.mount('#app')

仅供参考,侵权必删。

qq_30040197
关注 关注
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vue项目前端错误收集之sentry教程详解
12-09
sentry简介 Sentry 是一个开源的错误追踪工具,可以帮助开发人员实时监控和修复系统中的错误。其专注于错误监控以及提取一切事后处理所需的信息;支持几乎所有主流开发语言( JS/Java/Python/php )和平台, 并提供了web来展示输出错误。 sentry官网: https://sentry.io/ sentry安装 sentry 是一个开源的工具,可以自行搭建。 官方支持两种安装和运行 Sentry 服务器的方法, Docker 和 Python 。推荐使用 Docker 。 当然,对于刚开始接触 sentry 的同学,也可以直接使用官方提供的免费服务,但是有一些限制。 下面
美团精选合辑——前端系列1
08-03
它简化了图片的加载、缓存和显示过程,提供了强大的图片处理能力,包括裁剪、缩放、旋转等,对于前端开发者优化用户体验有着重要作用。 4. **EasyReact:美团客户端响应式框架** EasyReact是美团开发的一款轻量级...
vue3使用errorHandler捕获所有子组件的错误(throw错误测试)
最新发布
徐同保的专栏
05-08 667
vue3使用errorHandler捕获所有子组件的错误(throw错误测试)
vue3-API
liao__ran的博客
10-17 810
vue3使用时查询的API
VUE前端工程报错监控实践
pobu168的博客
06-17 1330
VUE前端工程报错监控实践
前端 Vue3 如何进行全局异常处理
黑马程序员官方博客
05-17 1921
要在Vue3中处理全局异常,可以使用Vue实例提供的errorHandler函数。此函数将捕获在组件生命周期期间发生的任何未处理错误,并允许我们在集中位置处理它们。在errorHandler函数中,可以以任何我们认为合适的方式处理错误。可以将其记录到控制台,发送到服务器或向用户显示错误消息。此外,我们还可以使用globalProperties函数将errorHandler函数添加到全局Vue对象中。这将允许我们从应用程序中的任何组件访问errorHandler函数。
解决encodeURIComponent传参时报Uncaught URIError: URI malformed的错误
gxdzi的博客
12-23 1563
uniapp和微信小程序在使用encodeURIComponent对url进行加密传参时,出现Uncaught URIError: URI malformed的错误,报这个错是因为传递的参数中包含了“%”字符,只需将%全部替换为%25再进行传参即可:str.replace(/%/g, ‘%25’);
url传参出现Uncaught URIError: URI malformed错误解决
热门推荐
稻草人的格子衫
08-14 9万+
url加密传参有时候会出现Uncaught URIError: URI malformed的错误,这是因为你的url中包含了“%”字符,浏览器在对“%”执行decodeURIComponent时报错,正确的解决是将%全部替换为%25再进行传输: urlStr.replace(/%/g, '%25');...
打造前端监控体系.pdf
08-21
日志上报是前端监控的重要组成部分,它将收集到的异常、资源错误和性能数据发送到服务器,以便于后续的分析和处理。日志上报通常会在用户行为触发的合适时机进行,如页面加载、点击事件等,以减少对用户体验的影响。...
前端面试题总结.docx
05-24
17. **Promise**:Promise解决了异步编程中回调地狱的问题,提供了链式调用和错误处理机制。 18. **async/await**:基于Promise的语法糖,使得异步代码更接近同步风格。 19. **HTTP与HTTPS**:HTTPS通过SSL/TLS...
国庆答疑问题收集表单1
08-04
同时运行前端和后端是有意义的,因为它们分别处理不同任务,共同确保自动驾驶的安全和效率。 3. 课程代码与个人代码差异: 课程代码可能更侧重教学目的,简洁明了地展示概念,而任老师的代码可能更接近实际应用,...
URIError: URI malformed错误
weixin_44313037的博客
09-02 3010
包含了“%”字符,浏览器在对“%”执行decodeURIComponent时报错,正确的解决是将%全部替换为%25再进行传输: Str.replace(/%/g, '%25');
js错误类型与错误信息统一收集
pzy_666的博客
02-26 2990
错误类型 Error 代码运行时的错误,除了 Error 这个对象,一些内置 错误类 在异常时返回,如SyntaxError、 EvalError 、 RangeError 、 ReferenceError 、 TypeError 等,具体信息Error Script error 跨域脚本,为了防止信息泄露,不会展示语法错误具体信息,只会展示 Script error. 可以先解决跨域: 客户端script标签添加 crossorigin=“anonymous” 服务端响应header添加 Access-
前端监控之资源加载异常
github_35780652的博客
05-05 603
一、意义:   资源加载异常将不能提供给正确资源给用户使用或阅读,比如重要的图片、错误的静态资源链接、网站执行的脚本等静态资源。有效的监听资源异常将提升网站的正常使用和展示。 二、捕获方法: window.addEventListener('error', function (event) { try { const target = event.target || event.srcElement; if ( target instanceo
前端技术】Vue3 技术学习笔记
Harvay的博客
08-31 978
Vue3学习记录 组合式api与新特性
你是怎么处理vue项目中的错误的?
yiyueqinghui的博客
02-25 976
一、错误类型 任何一个框架,对于错误处理都是一种必备的能力 在Vue 中,则是定义了一套对应的错误处理规则给到使用者,且在源代码级别,对部分必要的过程做了一定的错误处理。 主要的错误来源包括: 后端接口错误 代码中本身逻辑错误 二、后端接口错误 请求完成后捕获错误---------- 封装axios请求,通过catch捕获错误。 axios({ method:'get', url:'地址', }).then(res=>{ //成功处理 }).catch(err=>{
app前端和后端的数据交互
09-17
App前端和后端的数据交互是指在移动应用程序中,前端和后端之间进行数据的传输和交换。前端是指App用户界面的展示层,负责与用户交互,收集用户的输入并展示数据。后端是指服务器端的处理层,负责接收前端发送的请求并处理数据,最终将结果返回给前端。 在数据交互过程中,前端要向后端发送请求以获取所需的数据或执行相应的操作。请求可以通过HTTP协议发送,常见的请求类型有GET、POST、PUT、DELETE等。前端需要组装请求参数,如用户认证信息、查询条件等,并将其发送给后端。 后端在接收到前端的请求之后,会对请求进行解析,并根据请求内容进行相关的数据处理。后端可以通过访问数据库、调用其他接口或进行计算等操作来获取、处理或生成数据。处理完成后,后端会将处理结果封装成HTTP响应并发送给前端前端在接收到后端的响应之后,会对响应进行解析,提取出所需的数据并进行展示或执行相应的操作。前端可以根据后端返回的状态码和响应内容来处理异常情况,并根据需要进行相应的错误提示或重试操作。 为了实现高效的数据交互,可以采用一些优化策略。例如,可以使用数据缓存来减少网络请求次数,使用压缩算法压缩数据体积,使用异步请求来提升用户体验等。 总之,App前端和后端的数据交互是移动应用程序中至关重要的一环,它通过前后端之间的数据传输和交换,实现了用户界面和服务器端的无缝连接,满足了用户获取数据和执行操作的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 前端错误收集与处理 1616
  • js前端-下载文件 1226
  • 前端http请求api总结 265
  • web3.0 99

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • web3.0
  • 前端http请求api总结
  • js前端-下载文件
2023年4篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

哆哆女性网长津湖电影完整版起日本名暗黑破坏神3职业介绍宝宝免费起名测名打分出生八字张姓宝宝起名石家庄电力机务段以:广:字起名字男孩方托马斯男孩起名字姓氏石公司保密制度国际观察天涯给u盘起个名字鼠年出生起什么名字午夜福利92国语郭姓起甚么名字侏罗纪公园1女孩起名梓君的含义免费在线店起名八字在线免费起名孩子起名责任公司林帘湛廉时免费阅读最新章节佳字起名起名用雨起名字女孩名字thepiratebay猪宝宝起名宜用几个字文起名属猪的缺火起名字医疗公司起名大全厍姓起名2021年给孩子起啥名字好淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化