Open21
Error Boundary調べ
Error Boundaryの概要把握とどのように取り入れるかの理解する
reactのドキュメント読む
ドキュメントと同じようなこと書いてる気もするけど
- error boundaryコンポーネントの子コンポーネントのレンダリングエラーをcatchして代わりのUIを表示するもの
- classコンポーネントでの実装
- イベントハンドラ(handleClickとか)のerrorはcatchしない
Next.jsのエラーページ
実装して動作確認してみる
errorをthrowしてみる
const handleError = () => {
throw new Error('test')
}
yarn devの場合
yarn buildからのyarn startの場合
dialog出てこずconsoleにエラーが測れるだけ
カスタムエラーページ作って404動作したらこんなwarning出た
Warning: You have added a custom /_error page without a custom /404 page. This prevents the 404 page from being auto statically optimized.
See here for info: https://err.sh/next.js/custom-error-no-custom-404
404ページを別途作る
src/pages/404.tsx
import { NextPage } from 'next'
const Error404: NextPage = () => {
return <p>404専用ページだよ</p>
}
export default Error404
該当ページでthorw errorしてもカスタムのerrorページに飛ぶわけではないと
tsでのerror boundaryの実装を適当にここら辺から持ってくる
ドキュメントに書いてある通りイベントハンドラでerrorをthorwしてもErrorBoundaryは反応しない(consoleにエラーが測れるだけ)
まとめ
Next.jsのCustom Error Page
(クライアントサイドレンダリング前提)
- pages/_error.tsxに定義
- 404だけ別途pages/404.tsxに作った方が良いかも(最適化されるよ的な)
- getInitialProps内でエラー監視(sentryとか?)の設定してもいいかも
- page以下のコンポーネントでイベントハンドラ以外のerrorがthorwされたらcustom error pageが表示される
- getInitialPropsでinitial pageがloadされるときのハンドリングが定義できる
Error Boundary
- _app.tsxでError Boundary呼ぶと該当のerror(イベントハンドラ以外)がpage以下のコンポーネントでthorwされた時にError Boundary側がレンダリング される
- 基本ClassComponentでかく
共通
- Error Boundaryで拾ってくれるエラーはpages/_error.tsxも拾ってくれそうなのでNextのエラーハンドリングに寄せるで良さそう
- イベントハンドラ内のエラーはpages/_error.tsxでも検知しないので別途設計が必要そう
TODO
- イベントハンドラのエラーハンドリング設計
エラーハンドリングで考えること
- ランタイムエラー
- イベントハンドラでのエラー
- adapter, usecase, containerなどthrowしたエラーを最終的にどこで処理するか
- stackについて
- エラーからのリカバリについて
- nextjsのカスタムエラー?
- イベントハンドラの場合は共通でなんか処理する?
- 現状のコードではどのような場合にthrow new Error()してるか調べる
わざと子コンポーネントでランタイムエラー起こそうと思ったらbuildエラーになるだけだった
(foobarは未定義の変数)
<div>
{/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */}
{/* @ts-ignore */}
{foobar}
</div>
基本的にわざとランタイムエラーになるような書き方するとビルド時にnextjsがチェックしてくれてて、ビルドが失敗するようになってるっぽい
console.errorはsentryにエラーログが収集されない
consoleの内容はちゃんと収集され取りました