前端异常错误处理(包括但不限于react,vue)

错误异常发生

  • 页面js报错
  • 请求报错
  • 页面资源加载报错
  • promise异常
  • iframe加载异常
  • 页面奔溃&卡顿异常

处理异常的方法

1、react 自带的errorBoundaries
2、 react 自定义Hooks
3、 vue errorHandler
4、try catch 对特定的代码进行捕获
5、window.addEventListerner
6、window.onerror
7、 window.unhandledrejection
8、 iframe错误处理
9、跨域错误处理
10、页面奔溃卡顿处理
11、 统一上报错误(不会有跨域问题

ps: 在开发环境下,语法错误一般会在编辑器中直接抛出,导致程序奔溃,能够得到及时的处理。

1、react errorBoundaries错误边界

可以捕获发生在其子组件树任何位置的 JavaScript 错误,并打印这些错误,同时展示降级 UI.
而并不会渲染那些发生崩溃的子组件树。错误边界可以捕获发生在整个子组件树的渲染期间、生命周期方法以及构造函数中的错误。

引用官方文档实例:

class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError(error) {// 更新 state 使下一次渲染能够显示降级后的 UIreturn { hasError: true };}componentDidCatch(error, errorInfo) {// 你同样可以将错误日志上报给服务器logErrorToMyService(error, errorInfo);}render() {if (this.state.hasError) {// 你可以自定义降级后的 UI 并渲染return <h1>Something went wrong.</h1>;}return this.props.children; }
}

无法捕获到的错误:
事件处理
异步代码(setTimeout或requestAnimationFrame回调函数)
服务端渲染
自身抛出来的错误

2、react 自定义Hooks

const useThrowAsyncError = () => {const [state, setState] = useState();return (error) => {setState(() => throw error)}
}

使用:引入该hook

throwAsyncError(e)

自己封装hook,然后自己去调用setState throw把错误抛出去,调用setState会重新渲染,就会把错误抛出去,就是在渲染周期内了,errorBoundaries就能捕获到了

3、errorHandler

vue主要是通过errorCaptured钩子来捕获错误,通过errorHandler处理错误。
errorCaptured是捕获一个来自子孙组件的错误时被调用。

vue.config.errorHandler((err, vm, info) => {// err错误对象// vm 发生错误的组件实例// info 一个包含错误来源信息的字符串// false 该错误不会继续向上传播return false
})

只能捕获到同步的代码错误,异步错误需要用到装饰器。

4、 try catch 对特定的代码进行捕获

try-catch适合处理一些无法控制的错误,比如网络请求、各种I/O操作等。将代码中有可能发生错误的放在try语句块中,一旦发生异常,就将控制权转交给catch块执行,然后继续执行后续任务,不会阻塞进程。

try{//可能发生错误代码
} catch (err) {// 捕获
}

但try中发生的错误及异步任务、语法错误,catch捕获不到

5、 window.addEventListerner

<script>
window.addEventListener('error', (error) => {console.log('捕获到异常:', error);
}, true)
</script>
<img src="./xxxx.png">

返回的是errorEvent事件对象

6. window.onerror

js运行时,没有被try.catch捕获到的,一般会在window.onerror中捕获到

/**
* @param {String}  message    错误信息
* @param {String}  source    出错文件
* @param {Number}  lineno    行号
* @param {Number}  colno    列号
* @param {Object}  error  Error对象(对象)
*/
window.onerror = function(message, source, lineno, colno, error) {console.log('捕获到异常:',{message, source, lineno, colno, error});return true
}

1.window.onerror 函数只有在返回 true 的时候,异常才不会向上抛出(浏览器接收后报红),否则即使是知道异常的发生控制台还是会显示 Uncaught Error: xxxxx
2.window.onerror 最好写在所有JS脚本的前面,否则有可能捕获不到错误
3.window.onerror无法捕获语法错误

7. unhandledrejection

当 Promise 被 reject 且没有 reject 处理器的时候,会触发 unhandledrejection 事件;这可能发生在 window 下,但也可能发生在 Worker 中。发生在promise块中的错误,无论是否catch,都会触发unhandledrejection事件。

window.addEventListener("unhandledrejection", event => {console.warn(`UNHANDLED PROMISE REJECTION: ${event.reason}`);
});window.onunhandledrejection=function()=>{}

8. iframe错误处理

window.frame[0].onerror = function(message, source) => {}

9、跨域错误处理

script Error?当引用第三方script的时候,脚本出现错误,直接提示“script error”。

解决1:设置crossorigin=”anonymous”,在非同源情况下,设置 “anonymous” 关键字将不会通过 cookies,客户端 SSL 证书或 HTTP 认证交换用户凭据。但是这个属性并不是所有浏览器都支持(CORS settings attributes - HTML(超文本标记语言))。
解决2:将第三方脚本方法放在try-catch里。

10、页面奔溃卡顿处理

1.利用 window 对象的 load 和 beforeunload 事件实现了网页崩溃的监控。
不错的文章,推荐阅读:http://jasonjl.me/blog/2015/06/21/taking-action-on-browser-crashes/。

window.addEventListener('load', function () {sessionStorage.setItem('good_exit', 'pending');setInterval(function () {sessionStorage.setItem('time_before_crash', new Date().toString());}, 1000);});window.addEventListener('beforeunload', function () {sessionStorage.setItem('good_exit', 'true');});if(sessionStorage.getItem('good_exit') &&sessionStorage.getItem('good_exit') !== 'true') {/*insert crash logging code here*/alert('Hey, welcome back from your crash, looks like you crashed on: ' + sessionStorage.getItem('time_before_crash'));}

11、统一上报错误(不会有跨域问题)

利用img 的 src请求不跨域

function report(error) {const reportUrl = 'http://xxx/report/'new Image().src = `${reportUrl}?logs=${error}`
}

ps: img的src和script的src: 原理是相同的,都是利用标签的src属性可以跨域请求的特点,但是不同的是:
使用img标签不能访问服务器返回的响应内容,也就是说只能单向的发送get请求;
而使用script标签实现的jsonp跨域可以将服务器响应文本以函数参数的形式返回,浏览器解析js代码时直接就执行了。

总结:

1、可疑代码添加 try…catch
2、全局监控JS异常: window.onerror
3、全局监控静态资源异常: window.addEventListener
4、全局捕获没有 catch 的 promise 异常:unhandledrejection
5、iframe 异常:window.error
6、VUE errorHandler 和 React componentDidCatch
7、监控网页崩溃:window 对象的 load 和 beforeunload
8、Script Error 跨域用 crossOrigin 解决
9、统一错误上报,通过new image().src

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】日常笔记15

训练集和测试集并不来⾃同⼀个分布。这就是所谓的分布偏移。 真实⻛险是从真实分布中抽取的所有数据的总体损失的预期&#xff0c;然⽽&#xff0c;这个数据总体通常是⽆法获得的。计算真实风险公式如下&#xff1a; 为概率密度函数 经验⻛险是训练数据的平均损失&#xff0c;⽤…

【MySQL主从复制】

目录 一、MySQL Replication 1.概述 2.优点 二、MySQL复制类型 1.异步复制&#xff08;Asynchronous repication&#xff09; 2.全同步复制&#xff08;Fully synchronous replication&#xff09; 3.半同步复制&#xff08;Semisynchronous replication&#xff09; 三…

【Rust 基础篇】Rust FFI:连接Rust与其他编程语言的桥梁

导言 Rust是一种以安全性和高效性著称的系统级编程语言&#xff0c;具有出色的性能和内存安全特性。然而&#xff0c;在现实世界中&#xff0c;我们很少有项目是完全用一种编程语言编写的。通常&#xff0c;我们需要在项目中使用多种编程语言&#xff0c;特别是在与现有代码库…

ava版知识付费平台免费搭建 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

提供私有化部署&#xff0c;免费售后&#xff0c;专业技术指导&#xff0c;支持PC、APP、H5、小程序多终端同步&#xff0c;支持二次开发定制&#xff0c;源码交付。 Java版知识付费-轻松拥有知识付费平台 多种直播形式&#xff0c;全面满足直播场景需求 公开课、小班课、独…

Rust ESP32C3开发

Rust ESP32C3开发 系统开发逐步使用Rust语言&#xff0c;在嵌入式领域Rust也逐步完善&#xff0c;本着学习Rust和ESP32的目的&#xff0c;搭建了ESP32C3的环境&#xff0c;过程中遇到了不少问题&#xff0c;予以记录。 ESP-IDF开发ESP32 这一部分可跳过&#xff0c;是使用C开…

tensorflow错误及解决办法

tf.graph 节点没有数据 tensorflow.python.framework.errors_impl.InvalidArgumentError: Retval[2] does not have value.通过TensorFlow Retval[0] does not have value启发&#xff0c;怀疑是通过tf.cond构建网络图的时候&#xff0c;一次只走一个分支&#xff0c;导致另一…

docker更新jenkins

下载文件 1、jenkins提示下载 2、官网下载jenkins官网 文件放服务器内 通过工具把jenkins.war放进服务器例如tmp 文件复制到docker的jenkins容器 docker cp 路径文件 容器id:/{后面不接内容为根路径} docker cp /tmp/jenkins.war 53dc1c71058a:/进入容器内 docker exec …

golang实现多态

Go 通过接口来实现多态。在 Go 语言中&#xff0c;我们是隐式地实现接口。一个类型如果定义了接口所声明的全部方法&#xff0c;那它就实现了该接口。现在我们来看看&#xff0c;利用接口&#xff0c;Go 是如何实现多态的。 package mainimport "fmt"type Income in…

实训笔记7.28

实训笔记7.28 7.28笔记一、Hive的基本使用1.1 Hive的命令行客户端的使用1.2 Hive的JDBC客户端的使用1.2.1 使用前提1.2.2 启动hiveserver21.2.3 使用方式 1.3 Hive的客户端中也支持操作HDFS和Linux本地文件 二、Hive中DDL语法2.1 数据库的管理2.1.1 创建语法2.1.2 修改语法2.1.…

日期清洗的sql函数

sql语言是postgressql。 函数只处理了 中国格式 &#xff1a; xxxx年-xx月-xx日 美国格式&#xff1a; mm/dd/yyyy&#xff0c; September 04,1991&#xff0c; September 1991&#xff0c; sept 04&#xff0c; 1991 uunix格式&#xff1a; yyyy/mm/dd&#xff0c; yyyy/mm&am…

python测试开发面试常考题:装饰器

目录 简介 应用 第一类对象 装饰器 描述器descriptor 资料获取方法 简介 Python 装饰器是一个可调用的(函数、方法或类)&#xff0c;它获得一个函数对象 func_in 作为输入&#xff0c;并返回另一函数对象 func_out。它用于扩展函数、方法或类的行为。 装饰器模式通常用…

【学习笔记】[ZJOI2019] 开关

之前没认真学 F W T FWT FWT可惜了&#x1f605; 首先要做过这道题 [AGC034F] RNG and XOR 。 考虑 I F W T IFWT IFWT算法的本质&#x1f914; 之前我们注意到将 k k k的顺序调换并不会影响结果&#xff0c;也就是说只要做一遍 F W T FWT FWT&#xff0c;然后再除以 2 n 2^…

【数据结构】实验十一:图

实验十一 图 一、实验目的与要求 1&#xff09;掌握图的存储表示与操作实现。 2&#xff09;掌握图的连通性及其应用。 二、 实验内容 1.用邻接表存储一个图形结构&#xff0c;并计算每个顶点的度。 2. 采用深度和广度优先搜索算法&#xff0c;遍历上述这张图&#xff0c;…

vue 实现拖拽效果

实现方式&#xff1a;使用自定义指令可以实现多个面板拖拽互不影响 1.自定义指令 js directives: {// 拖拽drag(el) {el.onmousedown function (e) {let x e.pageX - el.offsetLeftlet y e.pageY - el.offsetTopdocument.onmousemove function (e) {el.style.left e.pag…

placeholder样式自定义(uniapp 微信小程序、h5)

一、使用uniapp开发 ①第一种方式&#xff1a;&#xff08;写在行内&#xff09; <input type"text" placeholder"姓名" placeholder-style"font-size:28rpx;color:#999999;" />②第二种方式&#xff1a; &#xff08;给input加上placeho…

《向量数据库指南》:向量数据库Pinecone如何集成数据湖

目录 为什么选择Databricks? 为什么选择Pinecone? 设置Spark集群 环境设置 将数据集加载到分区中 创建将文本转换为嵌入的函数 将UDF应用于数据 更新嵌入 摘要 使用Databricks和Pinecone在规模上创建和索引向量嵌入 建立在Apache Spark之上的Databricks是一个强大的…

【期末课程设计】学生成绩管理系统

因其独特&#xff0c;因其始终如一 文章目录 一、学生成绩管理系统介绍 二、学生成绩管理系统设计思路 三、源代码 1. test.c 2. Student Management System.c 3.Stu_System.c 4.Teacher.c 5.Student Management System.h 前言&#xff1a; 学生成绩管理系统含教师…

什么是Maven,Maven的概述及基本使用

MAVEN 一、Maven简介1.1、Maven概述1.2、Maven仓库1.3项目获取jar包过程 二、Maven使用2.1Maven安装配置2.1.1配置环境变量2.1.2配置本地仓库2.1.3配置阿里云私服 2.2Maven基本使用2.2.1Maven常用指令2.2.2Maven生命周期 总结 一、Maven简介 Apache Maven是一个项目管理和构建…

STM32 I2C OVR 错误

一、问题 STM32 I2C 用作从机时&#xff0c;开启如下中断并启用 callback 回调函数。 每一次复位后&#xff0c;从机都可以正常触发地址匹配中断ADDR&#xff0c;之后在该中断的回调函数中启用接收中断去收取数据时&#xff0c;却无法进入RXNE中断&#xff0c;而是触发了 OVR …

<C语言> 动态内存管理

1.动态内存函数 为什么存在动态内存分配&#xff1f; int main(){int num 10; //向栈空间申请4个字节int arr[10]; //向栈空间申请了40个字节return 0; }上述的开辟空间的方式有两个特点&#xff1a; 空间开辟大小是固定的。数组在申明的时候&#xff0c;必须指定数组的…