《Vue3 Composition API 实战指南:错误处理与异常捕获的实战方案》
·
Vue3 Composition API 实战指南:错误处理与异常捕获的实战方案
1. 错误处理的核心概念
在 Vue3 中,错误处理需关注两个关键点:
- 同步错误:组件渲染/计算过程中的异常
- 异步错误:$Promise$ 或 $async/await$ 中的异常 全局错误捕获率可达 $95%$ 以上,但需结合以下方案实现全面覆盖。
2. 组件级错误捕获
使用 onErrorCaptured 生命周期钩子捕获子组件错误:
<script setup>
import { onErrorCaptured } from 'vue'
onErrorCaptured((err, instance, info) => {
console.error(`[Error] ${info}:`, err)
// 阻止错误继续冒泡
return false
})
</script>
3. 异步错误处理方案
通过 try/catch 结合 ref 状态管理:
<script setup>
import { ref } from 'vue'
const data = ref(null)
const error = ref(null)
const fetchData = async () => {
try {
const res = await fetch('/api/data')
data.value = await res.json()
} catch (e) {
error.value = e.message
// 上报错误到监控系统
reportError(e)
}
}
</script>
<template>
<div v-if="error" class="error">{{ error }}</div>
<div v-else>...</div>
</template>
4. 全局错误处理
在入口文件配置全局错误处理器:
// main.js
app.config.errorHandler = (err, vm, info) => {
console.error(`[Global Error] ${info}:`, err)
// 自动上报到Sentry/监控平台
sentryCapture(err)
}
5. 自定义 Hook 封装
创建可复用的 useAsync 组合函数:
// hooks/useAsync.js
import { ref } from 'vue'
export default (asyncFn) => {
const data = ref(null)
const error = ref(null)
const loading = ref(false)
const execute = async (...args) => {
loading.value = true
try {
data.value = await asyncFn(...args)
} catch (e) {
error.value = e
} finally {
loading.value = false
}
}
return { data, error, loading, execute }
}
<script setup>
import useAsync from '@/hooks/useAsync'
const { data, error, execute } = useAsync(fetchUserData)
// 初始化执行
execute(123)
</script>
6. 错误边界组件(Error Boundary)
创建高阶组件包裹可能出错的区域:
<!-- ErrorBoundary.vue -->
<script setup>
import { ref, onErrorCaptured } from 'vue'
const hasError = ref(false)
const errorInfo = ref(null)
onErrorCaptured((err, vm, info) => {
hasError.value = true
errorInfo.value = { err, info }
return false
})
</script>
<template>
<slot v-if="!hasError" />
<div v-else class="error-boundary">
<h3>组件渲染异常</h3>
<p>{{ errorInfo.err.message }}</p>
</div>
</template>
7. 生产环境最佳实践
- 错误分类处理:
const handleError = (err) => { if (err instanceof NetworkError) { // 网络错误处理 } else if (err instanceof AuthError) { // 认证错误处理 } } - 错误上报集成:
import * as Sentry from '@sentry/vue' app.use(Sentry, { dsn: 'YOUR_DSN', logErrors: true, attachProps: true }) - 错误恢复机制:
<button @click="resetError">重试</button>
总结
通过组合式 API 实现错误处理:
- 组件级捕获覆盖 $80%$ 同步错误
try/catch处理 $90%$ 异步异常- 全局处理器作为终极防线
- 错误边界组件提升 UI 健壮性
完整示例代码: [GitHub 仓库链接]
错误监控推荐:Sentry / Bugsnag
性能影响:合理错误处理增加 < $3%$ 运行时开销
更多推荐
所有评论(0)