前端异常处理合集

文章目录

    • 前言:
    • 思考:
      • 一、为什么要处理异常?
      • 二、需要处理哪些异常?
    • js 代码处理
      • 基本的`try...catch`语句
    • Promise 异常
      • Promise 错误处理
      • async/await
    • 全局处理错误捕获
      • `window.onerror`
      • `window.onunhandledrejection`
      • `window.addEventListener`捕获事件处理错误
    • AJAX 请求异常
      • 拦截 HTTP 请求错误
    • 资源加载错误处理
    • 框架错误处理
      • React 错误边界(Error Boundaries)
      • Vue 全局错误处理
    • iframe 错误处理
    • 自定义全局异常处理函数 并 异常日志上报
    • Service Workers
    • 使用第三方库
    • 总结

前言:

在前端开发中,异常处理是一个重要的环节,它能够帮助我们捕获和处理程序运行时的错误,提高应用的稳定性和用户体验。
前端异常拦截处理是指在应用程序的全局或者局部范围内捕获和处理异常,以防止单个组件或模块中的错误影响整个应用的稳定性。

思考:

一、为什么要处理异常?

  • 增强用户体验;
  • 远程定位问题;
  • 完善的前端方案,前端监控系统;

二、需要处理哪些异常?

  • JS 代码错误(语法/内部执行)
  • Promise 异常
  • 全局错误处理
  • 静态资源加载异常
  • AJAX 请求异常
  • Iframe 异常
  • 框架异常处理(React、Vue)
  • 跨域 Script error
  • 错误上报
  • 自定义错误处理
  • 使用第三方库

js 代码处理

基本的try...catch语句

JavaScript 提供了try...catch语句来捕获代码块中的错误。这是最基本的异常处理方式。

try {// 尝试执行的代码let name = "zs";console.log(age);
} catch (error) {// 捕获错误并处理console.error("异常捕获:", error);
}

Promise 异常

Promise 错误处理

在异步编程中,Promise 提供了.catch()方法来处理异步操作中的错误。

fetch("/api/data").then((response) => response.json()).catch((error) => {console.error("请求失败:", error);});

async/await

async/await是 Promise 的语法糖,它允许我们以同步的方式编写异步代码。错误处理可以通过try...catch语句来实现。

async function fetchData() {try {const response = await fetch("https://jsonplaceholder.typicode.com/todos/1");const data = await response.json();return data;} catch (error) {console.error("请求失败:", error);}
}

全局处理错误捕获

window.onerror

这是一个全局事件处理器,可以捕获在全局作用域中发生的运行时错误。

window.onerror = function (message, source, lineno, colno, error) {console.error("捕获到全局错误:", message);// 可以在这里进行错误日志上报return true; // 返回true可以阻止默认的错误处理
};

window.onunhandledrejection

这个事件处理器用于捕获未被.catch()处理的 Promise 拒绝。

window.onunhandledrejection = function (event) {console.error("未处理的Promise拒绝:", event.reason);// 可以在这里进行错误日志上报
};

window.addEventListener捕获事件处理错误

对于事件监听器中可能抛出的错误,可以通过给window对象添加事件监听器来全局捕获。

window.addEventListener("error", function (event) {console.error("捕获到事件错误:", event.error);// 可以在这里进行错误日志上报
});

AJAX 请求异常

拦截 HTTP 请求错误

对于基于 Promise 的 HTTP 请求库(如 axios),可以设置全局的错误拦截器。

axios.interceptors.response.use(null, function (error) {// 判断状态码、code、获取接口统一标识flagconsole.error("HTTP请求错误:", error);// 错误日志上报return Promise.reject(error);
});

资源加载错误处理

对于图片、脚本、样式等资源的加载失败,我们可以通过onerror事件来处理。

<img src="image.jpg" onerror="errorImage(this)" /><script>function errorImage(dom) {dom.src = "./default.jpg"; // 修改为默认图片地址console.log(dom); // 打印输出}
</script>

框架错误处理

React 错误边界(Error Boundaries)

在 React 中,错误边界可以捕获其子组件树中 JavaScript 错误,并展示备用 UI,React 中通过 Class 创建组件,需要保证有 static getDerivedStateFromError 或者 componentDidCatch 属性

class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError(error) {return { hasError: true };}componentDidCatch(error, errorInfo) {// 错误日志上报console.error("React错误边界捕获错误:", error, errorInfo);}render() {if (this.state.hasError) {return <h1>Something went wrong.</h1>;}return this.props.children;}
}

使用组件:

<ErrorBoundary><MyWidget />
</ErrorBoundary>

Vue 全局错误处理

在 Vue 中,可以使用全局错误处理钩子errorHandler

Vue.config.errorHandler = function (err, vm, info) {console.error("Vue全局错误捕获:", err, info);// 错误日志上报
};

iframe 错误处理

<iframe src="./iframe.html" frameborder="0"></iframe>
<script>window.frames[0].onerror = function (message, source, lineno, colno, error) {console.log("捕获到 iframe 异常:", {message,source,lineno,colno,error,});return true;};
</script>

自定义全局异常处理函数 并 异常日志上报

可以创建一个全局的异常处理函数,并在应用的各个部分调用它。

function reportError(error) {fetch("/log-error", {method: "POST",headers: {"Content-Type": "application/json",},body: JSON.stringify({ error: error.toString() }),});
}function globalExceptionHandler(error) {console.error("全局异常处理:", error);// 错误日志上报reportError(error);
}// 使用
try {// 可能会抛出错误的代码
} catch (error) {globalExceptionHandler(error);
}

Service Workers

对于支持 Service Workers 的应用,可以在 Service Worker 中拦截请求并处理错误。

self.addEventListener("fetch", function (event) {event.respondWith(fetch(event.request).catch(function (error) {console.error("Service Worker请求错误:", error);// 返回备用响应或进行错误日志上报}));
});

使用第三方库

有许多第三方库可以帮助我们更好地处理异常,例如SentryBugsnag等,它们提供了错误捕获、上报和监控的功能。

总结

异常处理是前端开发中不可或缺的一部分,通过上述介绍的方法,它不仅能够提升应用的健壮性,可以有效地捕获和处理全局范围内的异常,减少因异常导致的程序崩溃,提高用户体验。

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

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

相关文章

数据挖掘——聚类

数据挖掘——聚类 聚类K-meansKNN VS K-meansK-Nearest Neighbors (KNN)K-means K中心算法PAM算法 K-modes算法——解决数据敏感的问题KMeans算法 ——解决初始点选择问题K-中心点层次方法AGNES算法——最小距离单链接全链接平均链接 聚类评估K均值和K中心点的优缺点层次化聚类…

Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)

文章目录 概述步骤 1: 安装 Nginx 和 Lua 模块步骤 2: 创建 Lua 脚本用于参数校验步骤 3: 配置 Nginx 使用 Lua 脚本写法二&#xff1a; 状态码写法三 &#xff1a; 返回自定义JSON复杂的正则校验 步骤 4: 测试和验证ngx.HTTP_* 枚举值 概述 一个不使用 OpenResty 的 Nginx 集…

虚拟机中的时统卡功能和性能调优

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…

GXUOJ-算法-补题:22级《算法设计与分析》第一次课堂练习

2.最大子数组和 问题描述 代码解答 #include<bits/stdc.h> using namespace std; const int N1005; int sum,n,a[N]; int res-1;int result(){for(int i0;i<n;i){if(sum<0) suma[i];else{suma[i];resmax(res,sum);}}return res; } int main(){cin>>n;for(i…

信息学奥赛一本通:1311:【例2.5】求逆序对

1311&#xff1a;【例2.5】求逆序对 时间限制: 1000 ms 内存限制: 65536 KB提交数:74572 通过数: 17809 【题目描述】 给定一个序列a1,a2,…,an&#xff0c;如果存在i<j并且ai>aj&#xff0c;那么我们称之为逆序对&#xff0c;求逆序对的数目。 【输入】 第一…

免登录游客卡密发放系统PHP网站源码

源码介绍&#xff1a; 这是一个简单易用的卡密验证系统&#xff0c;主要功能包括&#xff1a; 卡密管理和验证&#xff0c;多模板支持&#xff0c;响应式设计&#xff0c;验证码保护&#xff0c;防刷机制&#xff0c;简洁的用户界面&#xff0c; 支持自定义模板&#xff0c;移…

关于 PPPOE技术的详细解释

PPPoE&#xff08;以太网点对点协议&#xff09;是一种网络协议&#xff0c;它通过光纤将点对点协议&#xff08;PPP&#xff09;封装以实现宽带接入点。PPPoE主要用于ADSL和光纤等宽带接入技术中&#xff0c;它允许多个用户共享同一个交换机连接&#xff0c;同时为每个用户提供…

C# 服务应用研究

文章目录 创建Windows Service项目选中serviceInstaller1组件&#xff0c;查看属性生成和发布服务安装服务卸载服务重新再安装服务停止服务再次卸载服务调试服务 创建Windows Service项目 选中serviceInstaller1组件&#xff0c;查看属性 生成和发布服务 安装服务 卸载服务 重新…

MySQL中distinct和group by去重的区别

MySQL中distinct和group by去重的区别 在MySQL中&#xff0c;我们经常需要对查询结果进行去重&#xff0c;而DISTINCT和GROUP BY是实现这一功能的两种常见方法。虽然它们在很多情况下可以互换使用&#xff0c;但它们之间还是存在一些差异的。接下来&#xff0c;我们将通过创建测…

三维场景重建3D高斯点渲染复现

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;传知代码 欢迎大家点赞收藏评论&#x1f60a; 目录 三维场景重建概述MVSNetNerf3D gaussian-splatting 效果演示3D gaussian-splatting原理高斯分布的数学基础渲染过程优化与加速 3D Gaussian-sp…

小波滤波器处理一维信号-附Matlab源代码

⭕⭕ 目 录 ⭕⭕ 一、引言二、多分辨率分析原理2.1 概念解析2.2 尺度函数和小波函数的关系2.3 滤波器本质2.4 二维正交多分辨率分析 三、一维信号小波滤波器处理实例四、Matlab程序获取与验证 一、引言 Fourier变换无法同时描述和定位信号在时间和频率上的突变部分。小波变换的…

log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件

文章目录 一、DefaultRolloverStrategy1.1、DefaultRolloverStrategy节点1.1.1、filePattern属性1.1.2、DefaultRolloverStrategy删除原理 1.2、Delete节点1.2.1、maxDepth属性 二、知识扩展2.1、DefaultRolloverStrategy与Delete会冲突吗&#xff1f;2.1.1、场景一&#xff1a…

vue v-for 数据增加页面不刷新

<div style"float:left;border:1px solid red;height:100px;width:600px;"><el-form-item label"多语言配置" style"width:700px;" prop"validTanleHead"><el-input style"width: 180px" placeholder"请…

Mac 版本向日葵退出登录账号

找遍整个软件&#xff0c;Mac 版本的向日葵甚至逆天到没有提供退出登录的功能… 随后我发现可以直接删除向日葵的配置文件达到退出登录的效果&#xff0c;具体操作如下&#xff1a; cd /etc # 确认存在 orayconfig.conf 文件 ls orayconfig.conf  # 删除 sudo rm -f oray…

双目视觉:reprojectImageTo3D函数

前言 reprojectImageTo3D 是 OpenCV 中用于从视差图生成三维点云的函数。它的原理是利用视差图和相机的校准参数&#xff0c;通过三角测量法&#xff0c;计算每个像素对应的三维坐标。以下内容根据源码分析所写&#xff0c;觉得可以的话&#xff0c;点赞收藏哈&#xff01;&am…

苍穹外卖04——Redis初入门 在店铺打烊or营业状态管理功能中的使用

Redis入门 redis简介 它以键值对的形式存储数据在内存中,并且以极高的性能和灵活性而著称,通常用于缓存、消息代理以及持久化数据。 - 基于内存存储,读写性能高- 适合存储热点数据(热点商品、资讯、新闻)- 企业应用广泛Windows版下载地址:https://github.com/microsoft…

No.1十六届蓝桥杯备战|第一个C++程序|cin和cout|命名空间

第一个C程序 基础程序 使用DevC5.4.0 写一个C程序 在屏幕上打印hello world #include <iostream> using namespace std;int main() {cout << "hello world" << endl;return 0; } 运行这个C程序 F9->编译 F10->运行 F11->编译运行 mai…

springboot实战(19)(条件分页查询、PageHelper、MYBATIS动态SQL、mapper映射配置文件、自定义类封装分页查询数据集)

引言&#xff1a; 该类博客的学习是基于b站黑马视频springbootvue视频学习&#xff01;具体围绕项目——"大事件"进行实战学习。 目录 一、功能介绍&#xff08;需求&#xff09;。 1、文章列表功能基本介绍。 2、条件分页查询功能与注意。 3、前端页面效果。&#x…

LoRA微调系列笔记

系列文章目录 第一章&#xff1a;LoRA微调系列笔记 第二章&#xff1a;Llama系列关键知识总结 第三章&#xff1a;LLaVA模型讲解与总结 文章目录 系列文章目录LoRA&#xff1a;Low-Rank Adaptation of Large Language Models目的&#xff1a;依据&#xff1a;优势&#xff1a;…

Python - 游戏:飞机大战;数字华容道

Pygame是一个利用SDL库的写的游戏库&#xff0c;SDL呢&#xff0c;全名Simple DirectMedia Layer&#xff0c;是一位叫做Sam Lantinga的大牛写的 SDL是用C写的&#xff0c;不过它也可以使用C进行开发&#xff0c;当然还有很多其它的语言&#xff0c;Pygame就是Python中使用它的…