跳至内容

error.js

一个 **error** 文件允许您处理意外的运行时错误并显示回退 UI。

error.js special file
app/dashboard/error.tsx
'use client' // Error boundaries must be Client Components
 
import { useEffect } from 'react'
 
export default function Error({
  error,
  reset,
}: {
  error: Error & { digest?: string }
  reset: () => void
}) {
  useEffect(() => {
    // Log the error to an error reporting service
    console.error(error)
  }, [error])
 
  return (
    <div>
      <h2>Something went wrong!</h2>
      <button
        onClick={
          // Attempt to recover by trying to re-render the segment
          () => reset()
        }
      >
        Try again
      </button>
    </div>
  )
}

error.js 的工作原理

error.js 将路由段及其嵌套子级包装在一个 React 错误边界 中。当边界内抛出错误时,error 组件将显示为回退 UI。

How error.js works

需要了解:

  • 您可以使用 React DevTools 切换错误边界以测试错误状态。

属性

error

转发到 error.js 客户端组件的 Error 对象的实例。

需要了解:在开发过程中,转发到客户端的 Error 对象将被序列化并包含原始错误的 message 以便于调试。但是,**生产环境中的行为有所不同**,以避免将错误中可能包含的敏感详细信息泄露到客户端。

error.message

  • 从客户端组件转发的错误将显示原始的 Error 消息。
  • 从服务器组件转发的错误将显示包含标识符的通用消息。这是为了防止泄露敏感详细信息。您可以使用 errors.digest 下的标识符来匹配相应的服务器端日志。

error.digest

抛出错误的自动生成的哈希值。可用于匹配服务器端日志中的相应错误。

reset

错误的原因有时可能是暂时的。在这些情况下,再次尝试可能会解决问题。

错误组件可以使用 reset() 函数提示用户尝试从错误中恢复。执行时

app/dashboard/error.tsx
'use client' // Error boundaries must be Client Components
 
export default function Error({
  error,
  reset,
}: {
  error: Error & { digest?: string }
  reset: () => void
}) {
  return (
    <div>
      <h2>Something went wrong!</h2>
      <button onClick={() => reset()}>Try again</button>
    </div>
  )
}

global-error.js

虽然不常见,但即使利用国际化,你也可以使用位于根应用程序目录中的app/global-error.js处理根布局或模板中的错误。全局错误 UI 必须定义自己的<html><body> 标签。此文件在激活时替换根布局或模板。

app/global-error.tsx
'use client' // Error boundaries must be Client Components
 
export default function GlobalError({
  error,
  reset,
}: {
  error: Error & { digest?: string }
  reset: () => void
}) {
  return (
    // global-error must include html and body tags
    <html>
      <body>
        <h2>Something went wrong!</h2>
        <button onClick={() => reset()}>Try again</button>
      </body>
    </html>
  )
}

需要了解:

  • global-error.js 仅在生产环境中启用。在开发环境中,我们的错误覆盖层将显示。

not-found.js

在路由段中调用notFound() 函数时,not-found 文件会显示 UI。

版本历史

版本更改
v13.1.0引入了global-error
v13.0.0引入了error