Skip to content

Commit

Permalink
Move error logging to update callback (#21737)
Browse files Browse the repository at this point in the history
* Move error logging to update callback

This prevents double logging for gDSFE boundaries with createRoot.

* Add an explanation for the rest of duplicates
  • Loading branch information
gaearon committed Jun 24, 2021
1 parent 51b0bec commit 534c9c5
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,8 @@ describe('ReactDOMConsoleErrorReporting', () => {
}),
],
[
// TODO: This is duplicated only with createRoot. Why?
// This is only duplicated with createRoot
// because it retries once with a sync render.
expect.objectContaining({
message: 'Boom',
}),
Expand All @@ -181,7 +182,8 @@ describe('ReactDOMConsoleErrorReporting', () => {
}),
],
[
// TODO: This is duplicated only with createRoot. Why?
// This is only duplicated with createRoot
// because it retries once with a sync render.
expect.stringContaining('Error: Uncaught [Error: Boom]'),
expect.objectContaining({
message: 'Boom',
Expand Down Expand Up @@ -246,7 +248,8 @@ describe('ReactDOMConsoleErrorReporting', () => {
}),
],
[
// TODO: This is duplicated only with createRoot. Why?
// This is only duplicated with createRoot
// because it retries once with a sync render.
expect.objectContaining({
message: 'Boom',
}),
Expand All @@ -261,20 +264,15 @@ describe('ReactDOMConsoleErrorReporting', () => {
}),
],
[
// Addendum by React:
expect.stringContaining(
'The above error occurred in the <Foo> component',
),
],
[
// TODO: This is duplicated only with createRoot. Why?
// This is only duplicated with createRoot
// because it retries once with a sync render.
expect.stringContaining('Error: Uncaught [Error: Boom]'),
expect.objectContaining({
message: 'Boom',
}),
],
[
// TODO: This is duplicated only with createRoot. Why?
// Addendum by React:
expect.stringContaining(
'The above error occurred in the <Foo> component',
),
Expand All @@ -291,12 +289,6 @@ describe('ReactDOMConsoleErrorReporting', () => {
message: 'Boom',
}),
],
[
// TODO: This is duplicated only with createRoot. Why?
expect.objectContaining({
message: 'Boom',
}),
],
]);
}

Expand Down
15 changes: 7 additions & 8 deletions packages/react-reconciler/src/ReactFiberThrow.new.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,14 @@ function createClassErrorUpdate(
if (typeof getDerivedStateFromError === 'function') {
const error = errorInfo.value;
update.payload = () => {
logCapturedError(fiber, errorInfo);
return getDerivedStateFromError(error);
};
update.callback = () => {
if (__DEV__) {
markFailedErrorBoundaryForHotReloading(fiber);
}
logCapturedError(fiber, errorInfo);
};
}

const inst = fiber.stateNode;
Expand All @@ -119,16 +124,14 @@ function createClassErrorUpdate(
if (__DEV__) {
markFailedErrorBoundaryForHotReloading(fiber);
}
logCapturedError(fiber, errorInfo);
if (typeof getDerivedStateFromError !== 'function') {
// To preserve the preexisting retry behavior of error boundaries,
// we keep track of which ones already failed during this batch.
// This gets reset before we yield back to the browser.
// TODO: Warn in strict mode if getDerivedStateFromError is
// not defined.
markLegacyErrorBoundaryAsFailed(this);

// Only log here if componentDidCatch is the only error boundary method defined
logCapturedError(fiber, errorInfo);
}
const error = errorInfo.value;
const stack = errorInfo.stack;
Expand All @@ -150,10 +153,6 @@ function createClassErrorUpdate(
}
}
};
} else if (__DEV__) {
update.callback = () => {
markFailedErrorBoundaryForHotReloading(fiber);
};
}
return update;
}
Expand Down
15 changes: 7 additions & 8 deletions packages/react-reconciler/src/ReactFiberThrow.old.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,14 @@ function createClassErrorUpdate(
if (typeof getDerivedStateFromError === 'function') {
const error = errorInfo.value;
update.payload = () => {
logCapturedError(fiber, errorInfo);
return getDerivedStateFromError(error);
};
update.callback = () => {
if (__DEV__) {
markFailedErrorBoundaryForHotReloading(fiber);
}
logCapturedError(fiber, errorInfo);
};
}

const inst = fiber.stateNode;
Expand All @@ -119,16 +124,14 @@ function createClassErrorUpdate(
if (__DEV__) {
markFailedErrorBoundaryForHotReloading(fiber);
}
logCapturedError(fiber, errorInfo);
if (typeof getDerivedStateFromError !== 'function') {
// To preserve the preexisting retry behavior of error boundaries,
// we keep track of which ones already failed during this batch.
// This gets reset before we yield back to the browser.
// TODO: Warn in strict mode if getDerivedStateFromError is
// not defined.
markLegacyErrorBoundaryAsFailed(this);

// Only log here if componentDidCatch is the only error boundary method defined
logCapturedError(fiber, errorInfo);
}
const error = errorInfo.value;
const stack = errorInfo.stack;
Expand All @@ -150,10 +153,6 @@ function createClassErrorUpdate(
}
}
};
} else if (__DEV__) {
update.callback = () => {
markFailedErrorBoundaryForHotReloading(fiber);
};
}
return update;
}
Expand Down

0 comments on commit 534c9c5

Please sign in to comment.