MonitorSDK_前端错误收集(重点阐述VueReact错误监测)

article/2025/6/23 8:25:25

Promise中错误监测
前端错误收集方式

Vue中错误

Vue 全局错误处理器 app.config.errorHandler 详解


🔧 app.config.errorHandler 详解

📌 定义

app.config.errorHandler 是 Vue 应用实例的配置项之一,允许开发者定义一个函数来处理应用中的未捕获错误。

⚙️ 参数

该函数接受三个参数:

  • err: 错误对象。
  • instance(vm): 发生错误的组件实例。
  • info: 一个字符串,指示错误的来源类型,例如:组件渲染、事件处理器、生命周期钩子等。(cn.vuejs.org, 博客园, ByteNote)

🧩 错误来源类型

app.config.errorHandler 可以捕获以下来源的错误:

  • 组件渲染器
  • 事件处理器
  • 生命周期钩子
  • setup() 函数
  • 侦听器
  • 自定义指令钩子
  • 过渡 (Transition) 钩子

📝 示例代码

import { createApp } from 'vue';const app = createApp(App);app.config.errorHandler = (err, instance, info) => {console.error('全局错误处理:', err);console.log('发生错误的组件实例:', instance);console.log('错误信息:', info);
};:contentReference[oaicite:45]{index=45}

在这个示例中,当应用中发生未捕获的错误时,errorHandler 会被调用,打印错误信息。


🧪 Vue 中的错误示例

以下是一些常见的错误示例,展示了在不同场景下可能发生的错误:

1. 组件渲染器错误

在组件的模板中使用未定义的变量:(DevPress)

<template><div>{{ undefinedVariable }}</div>
</template>:contentReference[oaicite:55]{index=55}

这会导致渲染错误,errorHandler 中的 info 参数为 'render function'

2. 事件处理器错误

在事件处理函数中抛出错误:

<template><button @click="handleClick">点击</button>
</template><script>
export default {methods: {handleClick() {throw new Error('事件处理器错误');}}
};
</script>:contentReference[oaicite:65]{index=65}

此时,errorHandler 中的 info 参数为 'event handler'

3. 生命周期钩子错误

在生命周期钩子中抛出错误:(blog.dselegent.icu)

<script>
export default {mounted() {throw new Error('mounted 钩子错误');}
};
</script>:contentReference[oaicite:75]{index=75}

此时,errorHandler 中的 info 参数为 'mounted hook'

4. setup() 函数错误

setup() 函数中抛出错误:

<script setup>
throw new Error('setup 函数错误');
</script>:contentReference[oaicite:85]{index=85}

此时,errorHandler 中的 info 参数为 'setup function'

5. 侦听器错误

在侦听器中抛出错误:(cn.vuejs.org)

<script setup>
import { ref, watch } from 'vue';const count = ref(0);watch(count, () => {throw new Error('侦听器错误');
});
</script>:contentReference[oaicite:95]{index=95}

此时,errorHandler 中的 info 参数为 'watcher callback'

6. 自定义指令钩子错误

在自定义指令的钩子函数中抛出错误:(cn.vuejs.org)

<script setup>
const vColor = {mounted(el) {throw new Error('自定义指令钩子错误');}
};
</script><template><p v-color>文本</p>
</template>:contentReference[oaicite:105]{index=105}

此时,errorHandler 中的 info 参数为 'directive hook'

7. 过渡 (Transition) 钩子错误

在过渡钩子中抛出错误:(blog.dselegent.icu)

<script setup>
import { ref } from 'vue';const show = ref(false);function onEnter(el, done) {throw new Error('过渡钩子错误');
}
</script><template><button @click="show = !show">切换</button><Transition @enter="onEnter"><p v-if="show">内容</p></Transition>
</template>:contentReference[oaicite:115]{index=115}

此时,errorHandler 中的 info 参数为 'transition hook'


通过上述示例,可以更好地理解 app.config.errorHandler 的作用以及如何在不同场景下捕获和处理错误。

在这里插入图片描述


在 React 中,错误边界(Error Boundaries) 是一种机制,允许你捕获其子组件树中 JavaScript 错误,记录这些错误,并显示回退 UI,而不是渲染崩溃的组件树。


React中错误

🔍 什么是错误边界?

错误边界是 React 组件,它可以捕获其子组件树中发生的 JavaScript 错误,并渲染备用 UI,而不是崩溃的组件树。 (掘金)


⚙️ 如何实现错误边界?

要创建一个错误边界组件,你需要定义一个类组件,并实现以下生命周期方法之一或两者:

  • static getDerivedStateFromError(error):在渲染过程中抛出错误后调用,用于更新 state,以显示回退 UI。
  • componentDidCatch(error, errorInfo):在捕获到错误后调用,可用于记录错误信息。

示例代码:

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) {// 自定义回退 UIreturn <h1>出现了错误。</h1>;}return this.props.children; }
}

使用方式:

<ErrorBoundary><MyComponent />
</ErrorBoundary>

🚫 错误边界无法捕获的错误

需要注意的是,错误边界无法捕获以下类型的错误:

  • 事件处理器中的错误
  • 异步代码中的错误(例如 setTimeoutrequestAnimationFrame 回调)
  • 服务端渲染中的错误
  • 错误边界自身抛出的错误

对于这些情况,建议使用 try...catch 语句进行错误处理。


🛠️ 处理异步错误的策略

由于错误边界无法捕获异步代码中的错误,因此需要在异步操作中手动处理错误。例如,在 useEffect 中处理异步错误:

function MyComponent() {const [error, setError] = useState(null);useEffect(() => {asyncFunction().catch(err => setError(err));}, []);if (error) {// 可以选择抛出错误,让上层的错误边界捕获throw error;}return <div>内容</div>;
}

这种方式允许你在异步操作失败时,将错误传递给错误边界进行统一处理。


📦 使用第三方库:react-error-boundary

为了更方便地处理错误边界,可以使用第三方库 react-error-boundary。该库提供了更强大的功能,如重试机制、错误日志记录等。(阿里云开发者社区)

安装:

npm install --save react-error-boundary

示例代码:

import { ErrorBoundary } from 'react-error-boundary';function ErrorFallback({ error, resetErrorBoundary }) {return (<div role="alert"><p>发生了错误:</p><pre>{error.message}</pre><button onClick={resetErrorBoundary}>重试</button></div>);
}function App() {return (<ErrorBoundaryFallbackComponent={ErrorFallback}onReset={() => {// 重置应用状态}}><MyComponent /></ErrorBoundary>);
}

该库还提供了 useErrorHandler 钩子,用于在函数组件中捕获错误。


✅ 最佳实践

  • 局部与全局错误边界:根据需要,在应用的不同层级使用错误边界。例如,在顶层使用全局错误边界捕获整个应用的错误,在特定组件周围使用局部错误边界捕获特定部分的错误。
  • 友好的回退 UI:为用户提供清晰、友好的错误提示,而不是显示空白页面。
  • 错误日志记录:将错误信息记录到日志或发送到错误监控服务,便于后续分析和修复。
  • 处理异步错误:在异步操作中使用 try...catch 语句,或在 useEffect 中捕获并处理错误。
  • 避免错误边界自身出错:确保错误边界组件本身的稳定性,避免其自身抛出错误。

通过以上策略,可以有效地监测和处理 React 应用中的错误,提高应用的稳定性和用户体验。

在这里插入图片描述


http://www.hkcw.cn/article/ZAUnPnVxYh.shtml

相关文章

PCIe— Configuration

前言 设备初始化时&#xff0c; Configuration 状态在 2.5GT/s 速率下配置链路以及通道 编号。5GT/s 和 8GT/s 速率时&#xff0c;设备也可能从 Recovery 状态进⼊ Configuration 状态。此时状态转换的主要⽬的是为了进⾏多通道设备的 链路位宽动态转换。动态转换仅⽀…

山东一10岁男童在家门口走失 家属急寻线索

6月1日,有网友发布视频称山东省滕州市姜屯镇黄坡村一名10岁男孩赵某超走失。孩子家属十分焦急,希望通过网络社交媒体寻求帮助。当天下午,赵某超的外公王先生透露,通过查看家门口监控发现,孩子于5月31日下午5时左右走失。当时孩子先是在家门口消失了几分钟,然后返回了一次…

司机高速上突发呼吸性碱中毒 民警拉响警报6分钟送医

6月2日山东德州,司机高速上突发呼吸性碱中毒,同行司机开下高速求助,民警拉响警报6分钟送医。据了解,目前该司机已顺利出院。责任编辑:zx0002

泰国今年已迎1300万游客 旅游业显著复苏

泰国总理府副发言人萨西甘瓦塔娜詹近日表示,随着“2025神奇泰国”政策的推动,泰国旅游业在促进经济方面取得了显著进展。自2025年1月1日至5月18日,共有超过1300万名游客访问泰国,带动了超过6300亿泰铢的收入。最新数据显示,5月的第三周共有46.45万名外国游客到访泰国,其中…

洛阳的地铁到底有多难挖?

在华夏大地的历史版图上,洛阳无疑是一颗璀璨的明珠。这座有着深厚历史底蕴的城市,随便一挖就是文物,其地下宝藏之丰富,令人惊叹。洛阳地铁建设,堪称一场与历史的奇妙邂逅。施工时,考古发掘成为常态。从先秦的陶器,到汉唐的铜镜,再到明清的瓷器,不同时代的文物纷纷破土…

莫雷加德回应樊振东加盟德甲 欢迎新队友

5月31日,德国萨尔布吕肯乒乓球俱乐部宣布,乒乓球大满贯选手、巴黎奥运会乒乓球男单金牌得主樊振东将在下个赛季代表俱乐部参加德国乒乓球甲级联赛。消息一出,相关话题迅速登上微博热搜榜首。德国乒乓球运动员弗朗西斯卡帕特里克在社交媒体上欢迎樊振东加入队伍,瑞典乒乓球运…

【Godot引擎】如何使用内置的全局搜索功能提升开发效率

在日常使用 Godot 引擎 开发过程中&#xff0c;快速查找项目中的资源、脚本代码、节点、信号等内容&#xff0c;是大幅提高开发效率的关键手段。幸运的是&#xff0c;Godot 编辑器内置了全局搜索功能&#xff0c;可以非常方便地完成这一需求。本文将详细介绍如何使用这一功能&a…

Cesium 自带的标注碰撞检测实现标注避让

随机生成10000个点 let labels: any [] function addLabel(){labels viewer.scene.primitives.add(new Cesium.LabelCollection())for (let index 0; index < 10000; index) {const angle 2 * Math.PI * Math.random() // 随机角度labels.add({id: index,show: false,f…

Vue基础(12)_Vue.js循环语句用法:列表渲染

js补充 术语解释 循环(loop)&#xff1a;最基础的概念, 所有重复的行为。 递归(recursion)&#xff1a; 在函数内调用自身, 将复杂情况逐步转化成基本情况。 (数学)迭代(iterate) &#xff1a;在多次循环中逐步接近结果。 (编程)迭代(iterate) &#xff1a;按顺序访问线性结构中…

山西女子被送养36年后找到亲生父母 当事人:想过个真正的生日

程姗是被亲弟弟背进家门的,36年了,这是她第一次回家。6月1日上午,锣鼓声惊醒了忻州市解村的一条小巷,寻亲志愿者朱玉堂牵着程姗的手说:“来,回家。”程姗被簇拥着,伏在弟弟的背上,去往家的方向。程姗是姜家的第二个女儿,1989年农历二月初三出生,因父母交不起超生罚款…

奥地利年人均咖啡消费预测 咖啡热爱升级

奥地利人对咖啡情有独钟。根据国际消费品巨头Tchibo公司的一项最新调查,今年奥地利人均咖啡消费预计将超过1000杯,相比去年的日均2.65杯,这一数字今年上升至2.75杯。在咖啡饮用群体中,50至59岁年龄段的人最热衷,日均消费量达到3.24杯。相比之下,年轻一代的15至29岁人群日…

【头歌实验】Keras机器翻译实战

【头歌实验】Keras机器翻译实战 第1关&#xff1a;加载原始数据 编程要求 根据提示&#xff0c;在右侧编辑器补充代码&#xff0c;实现load_data函数&#xff0c;该函数需要加载path所代表的文件中的数据&#xff0c;并将文件中所有的内容按\n分割&#xff0c;转换成一个列表…

MCP调研

什么是 MCP MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;&#xff0c;是由 Anthropic 在 2024 年 11 月底推出的开放标准协议&#xff0c;旨在统一大型语言模型&#xff08;LLM&#xff09;与外部数据源、工具的通信方式。MCP 的主要目的在于…

车载软件更新 --- 数据完整性和正确性策略(数据验签事宜汇总)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

黄子韬将在斯里兰卡“交换人生” 体验异国文化魅力

黄子韬与妻子徐艺洋将参加中外文化交流纪实节目《小伙小妹换游记》,前往坦桑尼亚和斯里兰卡,体验异国生活。该节目采用双线叙事模式,记录中外青年在同一时间、不同国家的全新生活。节目将于6月5日在芒果TV播出。预告片展示了来自坦桑尼亚原始部落的青年Noel和从事矿业工作的…

小米门店开启YU7静态品鉴 全国92城陆续展示

小米门店开启YU7静态品鉴 全国92城陆续展示。今日,小米YU7已陆续到达北京多家门店。社交媒体上,相关门店的官方号于凌晨开启直播,即便是在凌晨1点,直播间内仍有大量观众围观。从小米汽车销售处了解到,目前YU7仅支持静态展示,试乘试驾的具体时间尚未确定,可能要等到正式上…

港股黄金股走强 中国白银集团涨超9% 避险情绪助推金价上涨

港股黄金股走强 中国白银集团涨超9% 避险情绪助推金价上涨!港股黄金股持续上涨,中国白银集团涨幅接近8%,紫金矿业涨幅超过3%,中国黄金国际股价再创新高,招金矿业和赤峰黄金也跟随上涨。金价周一攀升超过2%,纽约期金上涨2.7%至每盎司3400美元以上,白银价格上涨超过5%,纽…

张百乔终于离开配角和反派赛道!演技获陈凯歌高度评价!

张百乔终于离开配角和反派赛道!演技获陈凯歌高度评价,首演《三大队》翻拍片段男一号“程兵”,张百乔:一定要发朋友圈这可是凯歌导演的男一号啊!责任编辑:zx0002

专家称汽车从来都不是价格越低越好 价格战背后的风险

专家称汽车从来都不是价格越低越好 价格战背后的风险!最近车圈里硝烟弥漫的“价格战”席卷了整个市场。各路车企为了争夺地盘,纷纷亮出降价这一杀手锏。尤其是新能源车型,更是将“价格屠夫”的名号演绎到了极致。比亚迪又一次出手,秦PLUS DM-i智驾版限时补贴后价格跌破7万元…

日本女星滨崎步否认与马斯克有孩子 谣言四起引发猜测

日本女星滨崎步否认与马斯克有孩子 谣言四起引发猜测!埃隆马斯克近日被曝出曾与日本流行巨星育有子女,这一消息震惊了全美。《纽约时报》报道,这位一直警示少子化危机的企业家甚至表示愿意为提高生育率向任何人提供精子。据报道,马斯克在特朗普政府担任要职期间曾大量使用药…