errorCaptured 是 Vue 3 中用于父组件捕获子组件渲染、响应式更新及生命周期钩子错误的钩子,可拦截 setup/render/组合式 API 同步错误,但不捕获事件处理器、异步操作及 SSR 错误;需返回 false 阻止冒泡,并常配合状态管理实现 UI 降级。

errorCaptured 是 Vue 3(及 Vue 2.5+)中专为组件级错误捕获设计的生命周期钩子,它能在子组件渲染、响应式更新或生命周期钩子抛出错误时,**在父组件中提前拦截并处理**,是实现错误边界(Error Boundary)的核心机制。
errorCaptured 能捕获哪些错误?
它不捕获以下情况:
- 事件处理器中的错误(需用 try/catch 或 window.onerror)
- 异步操作(如 setTimeout、Promise.then)中抛出的错误(除非在 setup 或 render 中触发了响应式更新)
- 服务端渲染(SSR)期间的错误
- 全局错误(如未捕获的 Promise 拒绝,应配合
app.config.errorHandler)
它主要捕获:
- 子组件
setup()、render()函数执行异常 - 子组件
onMounted、onUpdated等组合式 API 钩子中同步抛出的错误 - 子组件模板中计算属性、v-if/v-for 表达式等响应式依赖求值失败
如何正确使用 errorCaptured?
该钩子接收三个参数:(err, instance, info),必须返回 false 才能阻止错误继续向上传播(否则会冒泡到父级 errorCaptured,最终触发全局 errorHandler):
export default {
errorCaptured(err, instance, info) {
console.error('子组件错误:', err)
console.log('出错组件实例:', instance)
console.log('错误类型信息:', info) // 如 'render'、'setup function'、'updated hook'
// 返回 false = 拦截错误,不再向上抛
// 返回 true 或不返回 = 继续冒泡
return false
}
}
在组合式 API 中写法一致:
从零开始编排 SpringBoot+Vue 全栈项目工作流,适用于新建全栈项目或完整脚手架请求,触发后依次调用 product‑spec‑builder(需求调研)等模块。
export default {
setup() {
// ...
},
errorCaptured(err, instance, info) {
// 同上
}
}
结合状态管理实现优雅降级
仅打印日志不够,常见做法是设置局部错误状态,让 UI 展示 fallback 内容:
export default {
data() {
return {
hasError: false,
errorMsg: ''
}
},
errorCaptured(err, instance, info) {
this.hasError = true
this.errorMsg = err.message || '组件加载异常'
return false
}
}
模板中即可条件渲染:
<div v-if="hasError">
<p class="error">⚠️ {{ errorMsg }}</p>
<button>重试</button>
</div>
<childcomponent v-else></childcomponent>
与 errorHandler 的分工协作
errorCaptured 是组件粒度的“前置拦截”,errorHandler 是应用粒度的“兜底捕获”。建议这样搭配:
- 用
errorCaptured在关键容器组件中做局部恢复(如重试、隐藏异常模块) - 用
app.config.errorHandler统一上报错误(如发送 Sentry)、记录日志、提示用户 - 两者不互斥——被
errorCaptured拦截后,若未返回false,仍会走到errorHandler
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










