unstable_rethrow
Функция unstable_rethrow
позволяет избежать перехвата внутренних ошибок, возникающих в Next.js при обработке ошибок, выброшенных в коде вашего приложения.
Например, вызов функции notFound
приводит к внутренней ошибке Next.js и отрисовке компонента not-found.js
. Однако если ошибка перехватывается блоком try/catch
, компонент not-found.js
не будет отрисован:
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
, чтобы повторно выбросить внутреннюю ошибку и продолжить ожидаемое поведение:
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 относятся:
cookies
headers
searchParams
fetch(..., { cache: 'no-store' })
fetch(..., { next: { revalidate: 0 } })
Полезно знать:
- Этот метод следует вызывать в начале блока catch, передавая объект ошибки в качестве единственного аргумента. Его также можно использовать в обработчике
.catch
промиса.- Если вызовы API, которые могут выбросить ошибку, не обернуты в try/catch, использовать
unstable_rethrow
не требуется.- Любые операции очистки ресурсов (например, очистка интервалов, таймеров и т.д.) должны выполняться либо до вызова
unstable_rethrow
, либо в блокеfinally
.