diff --git a/src/renderers/shared/fiber/ReactFiberUpdateQueue.js b/src/renderers/shared/fiber/ReactFiberUpdateQueue.js index c3c8cf7904e2b..1e185978321c8 100644 --- a/src/renderers/shared/fiber/ReactFiberUpdateQueue.js +++ b/src/renderers/shared/fiber/ReactFiberUpdateQueue.js @@ -76,7 +76,11 @@ exports.callCallbacks = function(queue : UpdateQueue, context : any) { if (callback && !node.callbackWasCalled) { node.callbackWasCalled = true; if (typeof context !== 'undefined') { - callback.call(context); + try { + callback.call(context); + } catch (error) { + // do something + } } else { callback(); } diff --git a/src/renderers/shared/fiber/__tests__/ReactIncremental-test.js b/src/renderers/shared/fiber/__tests__/ReactIncremental-test.js index 5df5c10caf800..7f207b1e9cee0 100644 --- a/src/renderers/shared/fiber/__tests__/ReactIncremental-test.js +++ b/src/renderers/shared/fiber/__tests__/ReactIncremental-test.js @@ -1465,4 +1465,46 @@ describe('ReactIncremental', () => { ]); expect(instance.state.n).toEqual(4); }); -}); + + it('can handle if setState callback throws', () => { + var ops = []; + var instance; + + class Foo extends React.Component { + state = { n: 0 }; + render() { + instance = this; + return
; + } + } + + ReactNoop.render(