Menu

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 は以下の通りです:

補足

  • このメソッドは catch ブロックの先頭で呼び出し、エラーオブジェクトを唯一の引数として渡す必要があります。Promise の .catch ハンドラー内でも使用できます。
  • エラーをスローする API 呼び出しをカプセル化し、呼び出し元が例外を処理させることで、unstable_rethrow の使用を避けられる場合があります。
  • unstable_rethrow は、キャッチされた例外にアプリケーションエラーとフレームワーク制御の例外(redirect()notFound() など)の両方が含まれる可能性がある場合にのみ使用してください。
  • リソースのクリーンアップ(インターバルやタイマーのクリアなど)は、unstable_rethrow の呼び出しの前に行うか、finally ブロック内で行う必要があります。