錯誤處理

本文件說明如何處理開發階段、伺服器端與客戶端的錯誤。

處理開發階段的錯誤

當 Next.js 應用程式在開發階段發生執行時期錯誤時,您會看到一個 錯誤遮罩。這是一個覆蓋網頁的模態視窗,在透過 pnpm devnpm run devyarn devbun dev 執行開發伺服器時可見,正式環境中不會顯示。修正錯誤後遮罩會自動消失。

以下是錯誤遮罩的範例:

開發模式下的錯誤遮罩範例

處理伺服器錯誤

Next.js 預設提供靜態 500 頁面來處理應用程式中發生的伺服器端錯誤。您也可以透過建立 pages/500.js 檔案來自訂此頁面

應用程式中的 500 頁面不會向使用者顯示具體錯誤資訊。

您還可以使用 404 頁面來處理特定執行時期錯誤,例如「檔案不存在」。

處理客戶端錯誤

React 的 錯誤邊界 (Error Boundaries) 是一種優雅的客戶端 JavaScript 錯誤處理方式,可讓應用程式的其他部分繼續運作。除了防止頁面崩潰外,它還能讓您提供自訂的後備元件,甚至記錄錯誤資訊。

要在 Next.js 應用程式中使用錯誤邊界,您需要建立一個類別元件 ErrorBoundary,並在 pages/_app.js 檔案中包裹 Component 屬性。該元件負責:

  • 在錯誤發生時渲染後備 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 狀態來追蹤錯誤。當 hasErrortrue 時,元件會渲染後備 UI;否則會渲染子元件。

建立 ErrorBoundary 元件後,請在 pages/_app.js 檔案中匯入並用它包裹 Component 屬性:

// 匯入 ErrorBoundary 元件
import ErrorBoundary from '../components/ErrorBoundary'

function MyApp({ Component, pageProps }) {
  return (
    // 用 ErrorBoundary 元件包裹 Component 屬性
    <ErrorBoundary>
      <Component {...pageProps} />
    </ErrorBoundary>
  )
}

export default MyApp

您可以在 React 文件中了解更多關於錯誤邊界的資訊。

錯誤回報

要監控客戶端錯誤,可以使用 Sentry、Bugsnag 或 Datadog 等服務。

On this page