Problem
When the React Native SDK enables native crash autocapture (@posthog/react-native-plugin, errorTracking.autocapture.nativeCrashes, see PostHog/posthog-js#3677), a fatal JS error can be captured twice:
- The JS layer captures it via
uncaughtExceptions autocapture (with the JS stack trace), and
- React Native rethrows fatal JS errors on the native side as a
com.facebook.react.common.JavascriptException on the main thread. posthog-android's uncaught-exception handler then captures it as a separate native crash (with a native stack trace).
The result is two $exception events for one logical error.
Suggested fix
posthog-android should expose a way to ignore exceptions that originate from React Native's fatal-JS path, and/or skip reporting throwables of type com.facebook.react.common.JavascriptException, so the JS-captured event is the single source of truth.
For reference, sentry-react-native does exactly this on the native side:
// React native internally throws a JavascriptException.
// we want to ignore it on the native side to avoid sending it twice.
options.addIgnoredExceptionForType(JavascriptException.class);
(https://github.com/getsentry/sentry-react-native/blob/f170ec355cd622d3e935478a23660ad4cb97e896/packages/core/android/src/main/java/io/sentry/react/RNSentryStart.java#L355)
Notes
Problem
When the React Native SDK enables native crash autocapture (
@posthog/react-native-plugin,errorTracking.autocapture.nativeCrashes, see PostHog/posthog-js#3677), a fatal JS error can be captured twice:uncaughtExceptionsautocapture (with the JS stack trace), andcom.facebook.react.common.JavascriptExceptionon the main thread. posthog-android's uncaught-exception handler then captures it as a separate native crash (with a native stack trace).The result is two
$exceptionevents for one logical error.Suggested fix
posthog-android should expose a way to ignore exceptions that originate from React Native's fatal-JS path, and/or skip reporting throwables of type
com.facebook.react.common.JavascriptException, so the JS-captured event is the single source of truth.For reference, sentry-react-native does exactly this on the native side:
(https://github.com/getsentry/sentry-react-native/blob/f170ec355cd622d3e935478a23660ad4cb97e896/packages/core/android/src/main/java/io/sentry/react/RNSentryStart.java#L355)
Notes