Menu

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

你可以使用 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 自身处理:

如果路由段被标记为除非是静态的否则会抛出错误,动态 API 调用也会抛出类似不应该被开发者捕获的错误。注意部分预渲染 (PPR) 也会影响这种行为。这些 API 包括:

值得注意的是

  • 这个方法应该在 catch 代码块的顶部调用,将错误对象作为其唯一参数传入。它也可以在 promise 的 .catch 处理程序中使用。
  • 如果你确保对可能抛出错误的 API 的调用没有被 try/catch 包裹,那么你就不需要使用 unstable_rethrow
  • 任何资源清理(如清除间隔、定时器等)都必须在调用 unstable_rethrow 之前或在 finally 代码块中进行。