Обработка ошибок: errorCaptured, app.config.errorHandler
↑ 4.1 Vue 3: основы, компоненты, Composition API · ← Предыдущая · → Следующая
Зачем это на собесе
Как не уронить приложение из-за ошибки в одном компоненте и собрать данные об ошибках.
Объяснение
Уровни обработки:
| Уровень | Механизм |
|---|---|
| Локальный | try/catch в обработчиках и async-функциях |
| Компонентная граница | onErrorCaptured (ловит ошибки потомков: рендер, хуки, watchers, обработчики) |
| Глобальный | app.config.errorHandler |
| Предупреждения | app.config.warnHandler (dev) |
| Вне Vue | window.addEventListener("error" / "unhandledrejection") |
| Роутер | router.onError |
| Запросы | обработка в API-клиенте/интерсепторах, onError в Vue Query |
<!-- ErrorBoundary.vue -->
<script setup lang="ts">
const error = ref<Error | null>(null);
onErrorCaptured((err, instance, info) => {
error.value = err as Error;
report(err, { info, component: instance?.$options.name });
return false; // остановить дальнейшее всплытие
});
const reset = () => (error.value = null);
</script>
<template>
<slot v-if="!error" />
<div v-else role="alert"><p>Что-то пошло не так</p><button @click="reset">Повторить</button></div>
</template>// main.ts
app.config.errorHandler = (err, instance, info) => { Sentry.captureException(err, { extra: { info } }); };
window.addEventListener("unhandledrejection", (e) => Sentry.captureException(e.reason));Практики:
- Error boundary вокруг крупных блоков (страница, виджет), чтобы сбой не «ронял» всё приложение.
- Понятные сообщения пользователю и кнопка «Повторить»; технические детали — в логи.
- Логирование в Sentry/аналог с контекстом (пользователь, маршрут, версия, breadcrumbs), source maps.
- Разделять ошибки: ожидаемые (валидация, 4xx) обрабатывать локально, неожиданные — глобально.
- Асинхронные ошибки в обработчиках событий Vue перехватываются глобальным обработчиком; вне Vue — нет.
Нюансы и подводные камни
errorCapturedне ловит ошибки в самом компоненте-границе и в асинхронном коде вне Vue.- Возврат
falseвerrorCapturedостанавливает распространение. unhandledrejectionдля промисов вне компонентов.- Не глотайте ошибки: минимум — логирование.
Практика
- Сделайте
ErrorBoundaryи оберните им страницы. - Настройте отправку ошибок в Sentry с source maps.
- Смоделируйте ошибку рендера и проверьте поведение.
Вопросы с ответами
Как ловить ошибки в компонентах-потомках?
onErrorCapturedв родителе (граница ошибок) и глобальноapp.config.errorHandler.
Что делает
return falseвerrorCaptured?Останавливает дальнейшее всплытие ошибки к родителям и глобальному обработчику.