mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Summary: For a very long time when a promise rejects without an attached catch we get this warning screen without a correct stack trace, only some internal calls to the RN internals. <img src="https://github.com/facebook/react-native/assets/1634213/75aa7615-ee3e-4229-80d6-1744130de6e5" width="200" /> I created [an issue for discussion](https://github.com/react-native-community/discussions-and-proposals/discussions/718) in the react-native-community repo and we figured out it was only a matter of symbolication. While it cannot be done on release without external packages and source maps, at least while developing we can provide a symbolicated stack-trace so developers can better debug the source of rejected promise. I got the stack trace symbolicated and the correct code frame. I'm missing some help trying to display it in the warning view but at the very least I can now correctly show the line of the error and log the codeframe to the console. ## Changelog: <!-- Help reviewers and the release process by writing your own changelog entry. Pick one each for the category and type tags: [GENERAL] [FIXED] - Show correct stack frame on unhandled promise rejections on development mode. For more details, see: https://reactnative.dev/contributing/changelogs-in-pull-requests Pull Request resolved: https://github.com/facebook/react-native/pull/40914 Test Plan: I simply created a throwing function on a dummy app, and checked the output of the console and the warning view: ```ts import React from 'react'; import {SafeAreaView, Text} from 'react-native'; async function throwme() { throw new Error('UNHANDLED'); } function App(): JSX.Element { throwme(); return ( <SafeAreaView> <Text>Throw test</Text> </SafeAreaView> ); } export default App; ``` Here is the output <img src="https://github.com/facebook/react-native/assets/1634213/2c100e4d-618e-4143-8d64-4095e8370f4f" width="200" /> Edit: I got the warning window working properly: <img src="https://github.com/facebook/react-native/assets/1634213/f02a2568-da3e-4daa-8132-e05cbe591737" width="200" /> Reviewed By: yungsters Differential Revision: D50324344 Pulled By: javache fbshipit-source-id: 66850312d444cf1ae5333b493222ae0868d47056
67 lines
1.9 KiB
JavaScript
67 lines
1.9 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
* @flow strict
|
|
*/
|
|
|
|
import typeof {enable} from 'promise/setimmediate/rejection-tracking';
|
|
|
|
import LogBox from './LogBox/LogBox';
|
|
|
|
let rejectionTrackingOptions: $NonMaybeType<Parameters<enable>[0]> = {
|
|
allRejections: true,
|
|
onUnhandled: (id, rejection = {}) => {
|
|
let message: string;
|
|
let stack: ?string;
|
|
|
|
// $FlowFixMe[method-unbinding] added when improving typing for this parameters
|
|
const stringValue = Object.prototype.toString.call(rejection);
|
|
if (stringValue === '[object Error]') {
|
|
// $FlowFixMe[method-unbinding] added when improving typing for this parameters
|
|
message = Error.prototype.toString.call(rejection);
|
|
const error: Error = (rejection: $FlowFixMe);
|
|
stack = error.stack;
|
|
} else {
|
|
try {
|
|
message = require('pretty-format')(rejection);
|
|
} catch {
|
|
message =
|
|
typeof rejection === 'string'
|
|
? rejection
|
|
: JSON.stringify((rejection: $FlowFixMe));
|
|
}
|
|
}
|
|
|
|
const warning = `Possible unhandled promise rejection (id: ${id}):\n${
|
|
message ?? ''
|
|
}`;
|
|
if (__DEV__) {
|
|
LogBox.addLog({
|
|
level: 'warn',
|
|
message: {
|
|
content: warning,
|
|
substitutions: [],
|
|
},
|
|
componentStack: [],
|
|
stack,
|
|
category: 'possible_unhandled_promise_rejection',
|
|
});
|
|
} else {
|
|
console.warn(warning);
|
|
}
|
|
},
|
|
onHandled: id => {
|
|
const warning =
|
|
`Promise rejection handled (id: ${id})\n` +
|
|
'This means you can ignore any previous messages of the form ' +
|
|
`"Possible unhandled promise rejection (id: ${id}):"`;
|
|
console.warn(warning);
|
|
},
|
|
};
|
|
|
|
export default rejectionTrackingOptions;
|