ErrorBoundary

Remix の ErrorBoundary コンポーネントは、通常の React の エラーバウンダリ と同じように動作しますが、いくつかの追加機能があります。ルートコンポーネントでエラーが発生すると、ErrorBoundary はその代わりにレンダリングされ、親ルート内にネストされます。ErrorBoundary コンポーネントは、ルートの loader または action 関数でエラーが発生した場合にもレンダリングされるため、そのルートのすべてのエラーを 1 か所で処理できます。

最も一般的なユースケースは次のとおりです。

  • 意図的に 4xx Response をスローしてエラー UI をトリガーする場合
    • 不正なユーザー入力に対して 400 をスローする
    • 権限のないアクセスに対して 401 をスローする
    • 要求されたデータが見つからない場合に 404 をスローする
  • React がレンダリング中にランタイムエラーが発生した場合、意図せずに Error をスローする可能性があります

スローされたオブジェクトを取得するには、useRouteError フックを使用できます。Response がスローされると、state / statusText / data フィールドを持つ ErrorResponse インスタンスに自動的にアンラップされるため、コンポーネント内で await response.json() を気にする必要はありません。スローされた Response をスローされた Error と区別するには、isRouteErrorResponse ユーティリティを使用できます。

import {
  isRouteErrorResponse,
  useRouteError,
} from "@remix-run/react";
 
export function ErrorBoundary() {
  const error = useRouteError();
 
  if (isRouteErrorResponse(error)) {
    return (
      <div>
        <h1>
          {error.status} {error.statusText}
        </h1>
        <p>{error.data}</p>
      </div>
    );
  } else if (error instanceof Error) {
    return (
      <div>
        <h1>Error</h1>
        <p>{error.message}</p>
        <p>The stack trace is:</p>
        <pre>{error.stack}</pre>
      </div>
    );
  } else {
    return <h1>Unknown Error</h1>;
  }
}