Готовые к продакшену границы ошибок для Vue 3 — декларативный компонент, composable для программного использования и слой отчётности на основе адаптеров.

Один необработанный throw в глубине дерева компонентов — и всё приложение превращается в белый экран у пользователя; vue-error-boundary-kit ограничивает область поражения одним виджетом вместо всей страницы.
Карточка товара, блок комментариев или виджет на дашборде оборачивается в собственную защитную границу — если он падает, соседние блоки продолжают работать, а не превращаются в тот же белый экран.
Обычный перехват ошибок в компонентах не видит исключения из обработчиков кликов, таймеров или необработанные отклонения промисов — для них нужен отдельный, глобальный перехват.
Сетевой запрос стоит повторить с задержкой, а ошибку в самой логике — сразу показать пользователю и остановиться. Границу можно настроить так, чтобы она сама различала эти два случая и не пыталась бессмысленно повторить то, что повторять не стоит.
Подключаемые адаптеры отправляют ошибки в Sentry, Bugsnag или свой HTTP-эндпоинт, а встроенная история в DevTools показывает, что упало, ещё до жалобы пользователя в поддержку.

Оборачивайте любую часть приложения в <ErrorBoundary> с fallback-слотом для отображения ошибки. Управляйте состоянием через resetKeys, maxRetries, автоматический сброс при изменении пропсов. Получайте доступ к ошибке, методам reset/retry и счётчику попыток как в слоте, так и через ref.

Используйте useErrorBoundary() для ручной регистрации ошибок из любого кода — например, при парсинге JSON или в обработчиках событий. А с помощью useGlobalErrorCapture() перехватывайте необработанные ошибки и отклонённые промисы, которые Vue не видит.

Отправляйте ошибки в Sentry, Bugsnag, LogRocket, HTTP endpoint или консоль через подключаемые адаптеры. Каждый адаптер поставляется отдельным entry point, не раздувая основной бандл. Встроенные rate-limiting и breadcrumbs защищают от спама и дают контекст.

Nuxt-модуль автоматически регистрирует компонент и утилиты. useNuxtErrorBoundary() перехватывает ошибки на уровне приложения, а useRouterErrorBoundary() — ошибки навигации и асинхронных роутов. Для TanStack Query есть хук сброса ошибочных запросов.

AsyncBoundary объединяет Suspense и ErrorBoundary с единым API и слотами loading/fallback. Для отладки используйте историю ошибок и панель в devtools. Все компоненты безопасны для SSR — ошибки рендеринга не роняют сервер, а гидратация всегда сходится к корректному состоянию.

Указывайте shouldCatch, чтобы граница перехватывала только нужные типы ошибок, пробрасывая остальные выше по дереву — это позволяет расставлять вложенные границы с разной зоной ответственности. Автоматический retry с экспоненциальной задержкой сам повторяет операцию после сбоя.
Оборачиваете часть дерева в <ErrorBoundary> — при падении рендерится fallback-слот, а resetKeys сбрасывает границу автоматически при смене роута.
<script setup lang="ts">
import { ErrorBoundary } from 'vue-error-boundary-kit'
import UserProfile from './UserProfile.vue'
const userId = ref('42')
const routeId = ref('profile')
function handleError(error) {
// error: CapturedError — see Types below
}
</script>
<template>
<ErrorBoundary :reset-keys="[routeId]" @error="handleError">
<template #default>
<UserProfile :id="userId" />
</template>
<template #fallback="{ error, reset, retryCount }">
<ErrorState :message="error.message" @retry="reset" />
</template>
</ErrorBoundary>
</template>useErrorBoundary() ловит то, что errorCaptured в принципе не видит — например, ошибку в обработчике события или при разборе непроверенных данных.
import { useErrorBoundary } from 'vue-error-boundary-kit'
const { error, hasError, reset, captureError } = useErrorBoundary({
onError: (e) => report(e),
reporter: myReporter,
})
try {
JSON.parse(untrustedInput)
} catch (err) {
captureError(err, { source: 'manual', componentName: 'ImportPanel' })
}createRateLimitedReporter оборачивает любые репортеры и сам режет дубликаты и всплеск отчётов — сломанный список, который перерендеривается сотни раз в секунду, не завалит Sentry одинаковыми событиями.
import { createSentryReporter } from 'vue-error-boundary-kit/adapters/sentry'
import { createRateLimitedReporter } from 'vue-error-boundary-kit/adapters/rate-limit'
const sentryReporter = createSentryReporter({ client: sentryClient })
const reporter = createRateLimitedReporter([sentryReporter], {
maxPerWindow: 10, // at most 10 reports forwarded per 10s window
dedupWindowMs: 10_000, // suppress identical repeats within this window
})
// Pass `reporter` to <ErrorBoundary>, useErrorBoundary(), or
// useGlobalErrorCapture() — it composes with everything else, same as any
// other ErrorReporter.