跳到主要内容

错误处理

本文档解释了如何处理开发、服务端和客户端错误。

处理开发环境中的错误

当 Next.js 应用的开发阶段出现运行时错误时,你会遇到一个覆盖层。这是一个覆盖网页的模态框。它在使用 next dev 通过 pnpm devnpm run devyarn devbun dev 运行开发服务器时可见,并且不会在生产环境中显示。修复错误将自动关闭覆盖层。

以下是覆盖层的示例:

开发模式下覆盖层的示例

处理服务端错误

Next.js 默认提供一个静态 500 页面来处理应用中发生的服务端错误。你还可以通过创建 pages/500.js 文件来自定义此页面

在应用中使用 500 页面不会向应用用户显示具体错误。

你还可以使用 404 页面来处理特定的运行时错误,如 file not found

处理客户端错误

React 错误边界是一种优雅的方式来处理客户端的 JavaScript 错误,以便应用的其他部分继续工作。除了防止页面崩溃外,它还允许你提供自定义的回退组件,甚至记录错误信息。

要在 Next.js 应用中使用错误边界,你必须创建一个类组件 ErrorBoundary 并在 pages/_app.js 文件中包裹 Component prop。该组件将负责:

  • 在抛出错误后渲染回退 UI
  • 提供重置应用状态的方法
  • 记录错误信息

你可以通过扩展 React.Component 来创建 ErrorBoundary 类组件。例如:

class ErrorBoundary extends React.Component {
constructor(props) {
super(props)

// 定义一个状态变量来跟踪是否存在错误
this.state = { hasError: false }
}
static getDerivedStateFromError(error) {
// 更新状态,以便下一次渲染将显示回退 UI

return { hasError: true }
}
componentDidCatch(error, errorInfo) {
// 你可以在这里使用自己的错误日志服务
console.log({ error, errorInfo })
}
render() {
// 检查是否抛出了错误
if (this.state.hasError) {
// 你可以渲染任何自定义的回退 UI
return (
<div>
<h2>哎呀,出错了!</h2>
<button
type="button"
onClick={() => this.setState({ hasError: false })}
>
再试一次?
</button>
</div>
)
}

// 如果没有错误,则返回子组件

return this.props.children
}
}

export default ErrorBoundary

ErrorBoundary 组件跟踪一个 hasError 状态。此状态变量的值是布尔值。当 hasError 的值为 true 时,ErrorBoundary 组件将渲染回退 UI。否则,它将渲染子组件。

创建 ErrorBoundary 组件后,将其导入到 pages/_app.js 文件中,以在 Next.js 应用中包裹 Component prop。

// 导入 ErrorBoundary 组件
import ErrorBoundary from '../components/ErrorBoundary'

function MyApp({ Component, pageProps }) {
return (
// 使用 ErrorBoundary 组件包裹 Component prop
<ErrorBoundary>
<Component {...pageProps} />
</ErrorBoundary>
)
}

export default MyApp

你可以在 React 文档中了解更多关于错误边界的信息。

报告错误

要监控客户端错误,请使用像 Sentry、Bugsnag 或 Datadog 这样的服务。