unstable_rethrow

Die Funktion unstable_rethrow kann verwendet werden, um das Abfangen interner Fehler von Next.js zu vermeiden, die beim Versuch auftreten, Fehler in Ihrem Anwendungscode zu behandeln.

Beispielsweise wirft der Aufruf der Funktion notFound einen internen Next.js-Fehler und rendert die Komponente not-found.js. Wenn dies jedoch innerhalb eines try/catch-Blocks geschieht, wird der Fehler abgefangen, wodurch das Rendern von not-found.js verhindert wird:

@/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)
  }
}

Mit der unstable_rethrow-API können Sie den internen Fehler erneut werfen und das erwartete Verhalten fortsetzen:

@/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)
  }
}

Die folgenden Next.js-APIs basieren auf dem Werfen eines Fehlers, der von Next.js selbst erneut geworfen und behandelt werden sollte:

Wenn ein Routensegment so markiert ist, dass es einen Fehler wirft, sofern es nicht statisch ist, wird auch ein dynamischer API-Aufruf einen Fehler werfen, der ähnlich nicht vom Entwickler abgefangen werden sollte. Beachten Sie, dass Partial Prerendering (PPR) dieses Verhalten ebenfalls beeinflusst. Diese APIs sind:

Wissenswertes:

  • Diese Methode sollte am Anfang des catch-Blocks aufgerufen werden, wobei das Fehlerobjekt als einziges Argument übergeben wird. Sie kann auch innerhalb eines .catch-Handlers eines Promises verwendet werden.
  • Wenn Sie sicherstellen, dass Ihre Aufrufe von APIs, die Fehler werfen, nicht in einem try/catch-Block eingeschlossen sind, müssen Sie unstable_rethrow nicht verwenden.
  • Jede Ressourcenbereinigung (wie das Löschen von Intervallen, Timern usw.) müsste entweder vor dem Aufruf von unstable_rethrow oder innerhalb eines finally-Blocks erfolgen.