Nuxt is a full-stack framework, which means there are several sources of unpreventable user runtime errors that can happen in different contexts:
server/ directory)You can hook into Vue errors using onErrorCaptured.
In addition, Nuxt provides a vue:error hook that will be called if any errors propagate up to the top level.
If you are using an error reporting framework, you can provide a global handler through vueApp.config.errorHandler. It will receive all Vue errors, even if they are handled.
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.vueApp.config.errorHandler = (error, instance, info) => {
    // handle error, e.g. report to a service
  }
  // Also possible
  nuxtApp.hook('vue:error', (error, instance, info) => {
    // handle error, e.g. report to a service
  })
})
vue:error hook is based on onErrorCaptured lifecycle hook.Nuxt will call the app:error hook if there are any errors in starting your Nuxt application.
This includes:
app:created and app:beforeMount hooksonErrorCaptured or with vue:errorapp:mounted hookYou cannot currently define a server-side handler for these errors, but can render an error page, see the Render an Error Page section.
You might encounter chunk loading errors due to a network connectivity failure or a new deployment (which invalidates your old, hashed JS chunk URLs). Nuxt provides built-in support for handling chunk loading errors by performing a hard reload when a chunk fails to load during route navigation.
You can change this behavior by setting experimental.emitRouteChunkError to false (to disable hooking into these errors at all) or to manual if you want to handle them yourself. If you want to handle chunk loading errors manually, you can check out the the automatic implementation for ideas.
fatal: true on the client) it will either render a JSON response (if requested with Accept: application/json header) or trigger a full-screen error page.An error may occur during the server lifecycle when:
It can also occur on the client side when:
app:beforeMount hook)onErrorCaptured or vue:error hookapp:mounted).Customize the default error page by adding ~/error.vue in the source directory of your application, alongside app.vue.
<script setup lang="ts">
import type { NuxtError } from '#app'
const props = defineProps({
  error: Object as () => NuxtError,
})
const handleError = () => clearError({ redirect: '/' })
</script>
<template>
  <div>
    <h2>{{ error?.statusCode }}</h2>
    <button @click="handleError">
      Clear errors
    </button>
  </div>
</template>
For custom errors we highly recommend using onErrorCaptured composable that can be called in a page/component setup function or vue:error runtime nuxt hook that can be configured in a nuxt plugin.
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hook('vue:error', (err) => {
    //
  })
})
When you are ready to remove the error page, you can call the clearError helper function, which takes an optional path to redirect to (for example, if you want to navigate to a 'safe' page).
$route or useRouter, as if a plugin threw an error, then it won't be re-run until you clear the error.useError in middleware to check if an error is being handled.useErrorfunction useError (): Ref<Error | { url, statusCode, statusMessage, message, description, data }>
This function will return the global Nuxt error that is being handled.
createErrorfunction createError (err: string | { cause, data, message, name, stack, statusCode, statusMessage, fatal }): Error
Create an error object with additional metadata. You can pass a string to be set as the error message or an object containing error properties. It is usable in both the Vue and Server portions of your app, and is meant to be thrown.
If you throw an error created with createError:
clearError.fatal: true.<script setup lang="ts">
const route = useRoute()
const { data } = await useFetch(`/api/movies/${route.params.slug}`)
if (!data.value) {
  throw createError({
    statusCode: 404,
    statusMessage: 'Page Not Found',
  })
}
</script>
showErrorfunction showError (err: string | Error | { statusCode, statusMessage }): Error
You can call this function at any point on client-side, or (on server side) directly within middleware, plugins or setup() functions. It will trigger a full-screen error page which you can clear with clearError.
It is recommended instead to use throw createError().
clearErrorfunction clearError (options?: { redirect?: string }): Promise<void>
This function will clear the currently handled Nuxt error. It also takes an optional path to redirect to (for example, if you want to navigate to a 'safe' page).
Nuxt also provides a <NuxtErrorBoundary> component that allows you to handle client-side errors within your app, without replacing your entire site with an error page.
This component is responsible for handling errors that occur within its default slot. On client-side, it will prevent the error from bubbling up to the top level, and will render the #error slot instead.
The #error slot will receive error as a prop. (If you set error = null it will trigger re-rendering the default slot; you'll need to ensure that the error is fully resolved first or the error slot will just be rendered a second time.)
<template>
  <!-- some content -->
  <NuxtErrorBoundary @error="someErrorLogger">
    <!-- You use the default slot to render your content -->
    <template #error="{ error, clearError }">
      You can display the error locally here: {{ error }}
      <button @click="clearError">
        This will clear the error.
      </button>
    </template>
  </NuxtErrorBoundary>
</template>
State Management
Nuxt provides powerful state management libraries and the useState composable to create a reactive and SSR-friendly shared state.
Server
Build full-stack applications with Nuxt's server framework. You can fetch data from your database or another server, create APIs, or even generate static server-side content like a sitemap or a RSS feed - all from a single codebase.