前端异常处理合集
文章目录
- 前言:
- 思考:
- 一、为什么要处理异常?
- 二、需要处理哪些异常?
- 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);// 返回备用响应或进行错误日志上报}));
});
使用第三方库
有许多第三方库可以帮助我们更好地处理异常,例如Sentry、Bugsnag等,它们提供了错误捕获、上报和监控的功能。
总结
异常处理是前端开发中不可或缺的一部分,通过上述介绍的方法,它不仅能够提升应用的健壮性,可以有效地捕获和处理全局范围内的异常,减少因异常导致的程序崩溃,提高用户体验。
相关文章:
前端异常处理合集
文章目录 前言:思考:一、为什么要处理异常?二、需要处理哪些异常? js 代码处理基本的try...catch语句 Promise 异常Promise 错误处理async/await 全局处理错误捕获window.onerrorwindow.onunhandledrejectionwindow.addEventListe…...
求职:求职者在现场面试中应该注意哪些问题?
求职者在现场面试中需要注意诸多方面的问题 面试前的准备 了解公司信息: 提前通过公司官网、社交媒体账号、新闻报道等渠道,熟悉公司的发展历程、业务范围、企业文化、主要产品或服务等内容。例如,如果是应聘一家互联网科技公司,…...
第2章波动光学引论—抓本质,本质必定简单
1波动光学的电磁理论 1.1波动方程 1)波动方程是通过描述波函数随时间和空间的变化来表达波动的传播和演化。 2)一维波动方程: a.一维波动方程描述了沿着一条直线传播的波动。它的一般形式为: ∂u/∂t v ∂u/∂x 其中ÿ…...
分类模型评估利器-混淆矩阵
相关文章 地理时空动态模拟工具介绍(上) 地理时空动态模拟工具介绍(下)地理时空动态模拟工具的使用方法 前言 混淆矩阵(Confusion Matrix)是机器学习领域中用于评估分类模型性能的一种工具。它通过矩阵的…...
算法题(23):只出现一次的数字
初级: 审题: 需要输出只出现了一次的数据,其他数据均出现了两次 思路: 若不限制空间复杂度: 方法一:哈希表 用哈希映射循环一次,把对应数字出现的次数记录到数组里面,然后再遍历一次…...
@RestController与@Controller区别
区别1: RestController是Controller的升级版 区别2: RestController用于标识一个类作为控制器,并且可以处理HTTP请求。控制器类通常用于接收用户输入并决定返回响应的内容。 RestController通常用于返回JSON或XML数据 区别3:…...
使用ExecutorService和@Async来使用多线程
文章目录 使用ExecutorService和Async来使用多线程采用ExecutorService来使用多线程多线程过程的详细解释注意事项优点 使用Async来使用多线程对比Async和ExecutorService的多线程使用方式使用 ExecutorService 的服务类使用 Async 的服务类异步任务类自定义线程池主应用类解释…...
计算机网络 (19)扩展的以太网
前言 以太网(Ethernet)是一种局域网(LAN)技术,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网技术不断演进,从最初的10Mbps到如今的10Gbps、25Gbps、40Gbps、100Gbps等,已成…...
构造器/构造方法
1. 构造器 1.1 概述 先浏览下面简单代码; class Cons{ // 属性int age;String name; // 方法public void show(){System.out.println("age"age);} } class ConsTest{public static void main(String[] args) {Cons c new Cons();// Cons() 就是…...
异常
目录 1. 异常的概念及使用 1.1 异常的概念 1.2 异常的抛出和捕获 1.3 栈展开 1.4 查找匹配的处理代码 1.5 异常的重新抛出 1.6 异常安全问题 1.7 异常规范 2. 标准库的异常 1. 异常的概念及使用 1.1 异常的概念 异常处理机制允许程序中独⽴开发的部分能够在运⾏时就…...
MySQL中distinct和group by去重的区别
MySQL中distinct和group by去重的区别 在MySQL中,我们经常需要对查询结果进行去重,而DISTINCT和GROUP BY是实现这一功能的两种常见方法。虽然它们在很多情况下可以互换使用,但它们之间还是存在一些差异的。接下来,我们将通过创建测…...
Qt判别不同平台操作系统调用相应动态库读取RFID
本示例使用的读卡器:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b8jdyXi&ftt&id562957272162 #include <QDebug> #include "mainwindow.h" #include "./ui_mainwindow.h" #include "QLibrary"…...
vue2+echarts实现水球+外层动效
实现效果 安装echarts-liquidfill 需要安装echarts-liquidfill!!!需要安装echarts-liquidfill!!!需要安装echarts-liquidfill!!! 安装命令 npm install echarts-liqui…...
C++ 基础思维导图(一)
目录 1、C基础 IO流 namespace 引用、const inline、函数参数 重载 2、类和对象 类举例 3、 内存管理 new/delete 对象内存分布 内存泄漏 4、继承 继承权限 继承中的构造与析构 菱形继承 1、C基础 IO流 #include <iostream> #include <iomanip> //…...
【gopher的java学习笔记】依赖管理方式对比(go mod maven)
什么是go mod go mod是Go语言官方引入的模块管理工具,旨在简化项目依赖管理,提高构建的可重复性和稳定性。以下是关于go mod的详细介绍: 在go mod之前,Go语言主要依赖GOPATH和vendor目录来管理项目依赖。然而,这种方式…...
CTFshow—远程命令执行
29-35 Web29 代码利用正则匹配过滤了flag,后面加了/i所以不区分大小写。 可以利用通配符绕过 匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个) ls file * ? 匹配任何一个字符(不…...
Qt之简易音视频播放器设计(十五)
Qt开发 系列文章 - MediaPlayer(十五) 目录 前言 一、QMediaPlayer 二、实现方式 1.添加multimedia 2.创建类vedioplayer 3.UI设计 4.用户使用 5.效果演示 总结 前言 利用Qt进行音视频播放器设计,首先比较方便使用的是Qt自带的音视…...
ArrayList 和LinkedList的区别比较
前言 ArrayList和LinkedList的主要区别在于它们的底层数据结构、性能特点以及适用场景。ArrayList和LinkedList从名字分析,他们一个是Array(动态数组)的数据结构,一个是Linked(链表)的数据结构&#x…...
Wallpaper壁纸制作学习记录13
骨骼物理模拟 Wallpaper Engine还允许您为人偶变形骨骼配置某些物理模拟。选择骨骼时,点击编辑约束来配置骨骼这些属性。 警告 请记住,物理模拟可能会根据用户的最大FPS设置略微改变其行为。 Wallpaper Engine编辑器将始终以高帧速率渲染。您可以将壁纸…...
Visual Studio 2022安装教程
1、下载网址 Visual Studio 2022 IDE安装网址借助 Visual Studio 设计,具有自动完成、构建、调试、测试功能的代码将与 Git 管理和云部署融为一体。https://visualstudio.microsoft.com/zh-hans/vs/ 点击图片所示 双击运行 2、安装 点击C桌面开发(右边…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
