Skip to content

Commit

Permalink
Unhandled promise rejection - attach non-standard Error object stack …
Browse files Browse the repository at this point in the history
…info if possible (#42079)

Summary:
This is a continuation of my [last PR](#40914) which improved the symbolication of unhandled promise rejections.

While I was developing another library I noticed I still got an error stack of the log adding and not of the error itself. The library I'm trying to debug does not throw a standard error object but rather a custom one, but it still contains the stack field. By passing this stack field to the logbox call I was able to get a better symbolicated stack trace. The exact line of the failure is not displayed but at least the correct file is.

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[GENERAL] [ADDED] - Unhandled promise rejection - attach non-standard Error object stack info if possible

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests

Pull Request resolved: #42079

Test Plan:
Test any unhandled promise rejection with a non-standard error (line 23, toString must not return `[object Error]`) and see if the correct (or at least a better) stack trace is shown.

Here is the one I got before and after this change:

<img src="https://github.com/facebook/react-native/assets/1634213/3d07faad-9535-42c9-8032-b4d8fe407e88" width="200" />

<img src="https://github.com/facebook/react-native/assets/1634213/2c39bd82-c7a1-4f58-8ac4-5c479bb96b6e" width="200" />

Reviewed By: huntie

Differential Revision: D52431711

Pulled By: cipolleschi

fbshipit-source-id: be2172d3b1e2fc3f72812faac372c83bc6dface2
  • Loading branch information
ospfranco authored and facebook-github-bot committed Dec 28, 2023
1 parent e85d51c commit 655b12d
Showing 1 changed file with 5 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ let rejectionTrackingOptions: $NonMaybeType<Parameters<enable>[0]> = {
? rejection
: JSON.stringify((rejection: $FlowFixMe));
}
// It could although this object is not a standard error, it still has stack information to unwind
// $FlowFixMe ignore types just check if stack is there
if (rejection.stack && typeof rejection.stack === 'string') {

This comment has been minimized.

Copy link
@Romick2005

Romick2005 Jan 9, 2024

Contributor

Why do you need to check if rejection.stack exist? Would it be better to have just
if (typeof rejection.stack === 'string') {
instead of
if (rejection.stack && typeof rejection.stack === 'string') {

Seems like too much bullet proof conditions here.

stack = rejection.stack;
}
}

const warning = `Possible unhandled promise rejection (id: ${id}):\n${
Expand Down

0 comments on commit 655b12d

Please sign in to comment.