unstable_rethrow
unstable_rethrow は、アプリケーションコードで発生したエラーの処理時に Next.js が発生させる内部エラーをキャッチしないようにするために使用できます。
例えば、notFound 関数を呼び出すと Next.js の内部エラーが発生し、not-found.js コンポーネントがレンダリングされます。しかし、try/catch ステートメントの try ブロック内で使用すると、エラーがキャッチされ、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)
}
}unstable_rethrow API を使用して内部エラーを再スローし、期待される動作を続行できます:
@/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)
}
}以下の Next.js API は、エラーを発生させ、Next.js 自体が再スローおよび処理する必要があります:
ルートセグメントが静的でない限りエラーをスローするようにマークされている場合、Dynamic API 呼び出しもエラーを発生させます。このエラーは開発者がキャッチすべきではありません。Partial Prerendering (PPR) もこの動作に影響します。これらの API は以下の通りです:
cookiesheaderssearchParamsfetch(..., { cache: 'no-store' })fetch(..., { next: { revalidate: 0 } })
補足:
- このメソッドは catch ブロックの先頭で呼び出し、エラーオブジェクトを唯一の引数として渡す必要があります。Promise の
.catchハンドラー内でも使用できます。- エラーをスローする API 呼び出しをカプセル化し、呼び出し元が例外を処理させることで、
unstable_rethrowの使用を避けられる場合があります。unstable_rethrowは、キャッチされた例外にアプリケーションエラーとフレームワーク制御の例外(redirect()やnotFound()など)の両方が含まれる可能性がある場合にのみ使用してください。- リソースのクリーンアップ(インターバルやタイマーのクリアなど)は、
unstable_rethrowの呼び出しの前に行うか、finallyブロック内で行う必要があります。