unstable_rethrow

Функция unstable_rethrow позволяет избежать перехвата внутренних ошибок, возникающих в Next.js при обработке ошибок, выброшенных в коде вашего приложения.

Например, вызов функции notFound приводит к внутренней ошибке Next.js и отрисовке компонента not-found.js. Однако если ошибка перехватывается блоком try/catch, компонент not-found.js не будет отрисован:

@/app/ui/component.tsx
import { notFound } from 'next/navigation'

export default async function Page() {
  try {
    const post = await fetch('https://.../posts/1').then((res) => {
      if (res.status === 404) notFound()
      if (!res.ok) throw new Error(res.statusText)
      return res.json()
    })
  } catch (err) {
    console.error(err)
  }
}

Используйте API unstable_rethrow, чтобы повторно выбросить внутреннюю ошибку и продолжить ожидаемое поведение:

@/app/ui/component.tsx
import { notFound, unstable_rethrow } from 'next/navigation'

export default async function Page() {
  try {
    const post = await fetch('https://.../posts/1').then((res) => {
      if (res.status === 404) notFound()
      if (!res.ok) throw new Error(res.statusText)
      return res.json()
    })
  } catch (err) {
    unstable_rethrow(err)
    console.error(err)
  }
}

Следующие API Next.js используют механизм выбрасывания ошибок, которые должны быть повторно выброшены и обработаны самим Next.js:

Если сегмент маршрута настроен на выбрасывание ошибки, если он не является статическим, динамический API-вызов также выбросит ошибку, которую разработчик не должен перехватывать. Обратите внимание, что частичный пререндеринг (PPR) также влияет на это поведение. К таким API относятся:

Полезно знать:

  • Этот метод следует вызывать в начале блока catch, передавая объект ошибки в качестве единственного аргумента. Его также можно использовать в обработчике .catch промиса.
  • Если вызовы API, которые могут выбросить ошибку, не обернуты в try/catch, использовать unstable_rethrow не требуется.
  • Любые операции очистки ресурсов (например, очистка интервалов, таймеров и т.д.) должны выполняться либо до вызова unstable_rethrow, либо в блоке finally.