polidog lab

Top About Rss
2021年08月26日

react-native-error-boundaryを使ってみた

ReactNativeのアプリで原因不明のアプリのクラッシュが結構発生していました。
クラッシュの原因は頑張って特定できましたが、問題はSentryに情報が記録されていないことでした。

どうしようかなと思ったけど、Reactがコンポーネントないの処理のエラーハンドリングにError Boundaryを使うのをみてこれはReact Nativeでも使えばいいんだろうなと。

ReactNativeでも componentDidCatch を使えるのでError Boundaryが使えるわけですが、関数コンポーネントにしたかったので今回はreact-native-error-boundaryを使うことにしました。

ErrorBoundaryのFallbackComponentに指定するコンポーネントのなかでSentryのcaptureExceptionを実行すればSentryに記録することが出来ました。

// src/compnents/ErrorHandler/index.tsx

import React from 'react'
import {Text, View, Button} from 'react-native'
import ErrorBoundary from 'react-native-error-boundary'
import * as Sentry from '@sentry/react-native'

interface FallbackProps {
  error: Error
  resetError: () => void
}

const ErrorFallback: React.FC<FallbackProps> = ({error}) => {
  Sentry.captureException(error)
  return (
  <View>
    <Text>エラーが発生しました</Text>
    <Text>{props.error.toString()}</Text>
    <Button onPress={props.resetError} title={'Try again'} />
  </View>
  )
}

export const ErrorHandler: React.FC = ({children}) => (
  <ErrorBoundary FallbackComponent={ErrorFallback}>{children}</ErrorBoundary>
)
comments powered by Disqus