Discard duplicate JS exceptions in iOS New Architecture #2148
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Goal
In the Old Architecture React Native raises an Objective-C
RCTFatalException
when an unhandled JS exception occurs. These are discarded in the native notifier because BugSnag's JS layer also catches these JS exceptions.However in 0.73+, with New Architecture enabled, these exceptions are caught and rethrown as a cpp exception, so the discard pattern no longer applies and a duplicate native event is reported.
This PR adds an additional
onSendError
block (when the New Architecture is enabled) to also discard these new exception typesDesign
Because this new exception type
facebook::jsi::JSError
is also thrown for any exceptions that occur in Turbo Module methods, we're not able to discard unhandled JS exceptions using adiscardClasses
pattern.Instead an onSendError callback is used to discard based on the error message. For unhandled JS exceptions the error message is always prepended with
Exception in HostFunction: Unhandled JS Exception
Changeset
Added a new
onSendError
block to the native config inBugsnagReactNativePlugin.m
if the New Architecture is enabled.The iOS New Architecture tests for 0.73 have been reinstated - as part of this all scenarios that throw native exceptions have been split into separate tests for old arch and new arch to account for the new exception handling behaviour in iOS Turbo Modules
Testing
Covered by a full CI run