使用react时无法从window.onerror获取错误对象

时间:2016-02-26 04:51:12

标签: javascript reactjs

window.onerror = function(message, filename, lineno, colno, error) {
    console.log(error.stack);
};

没有reactjs,一切都很好。我可以得到筹码。

使用reactjs,我得到以下内容:

Uncaught TypeError: Cannot read property 'stack' of null
window.onerror                              @ index.html:9
ReactErrorUtils.invokeGuardedCallback       @ ReactErrorUtils.js:71
executeDispatch                             @ EventPluginUtils.js:79
executeDispatchesInOrder                    @ EventPluginUtils.js:102
executeDispatchesAndRelease                 @ EventPluginHub.js:43
executeDispatchesAndReleaseTopLevel         @ EventPluginHub.js:54
forEachAccumulated                          @ forEachAccumulated.js:23
EventPluginHub.processEventQueue            @ EventPluginHub.js:259
runEventQueueInBatch                        @ ReactEventEmitterMixin.js:18
ReactEventEmitterMixin.handleTopLevel       @ ReactEventEmitterMixin.js:34
handleTopLevelWithoutPath                   @ ReactEventListener.js:93
handleTopLevelImpl                          @ ReactEventListener.js:73
Mixin.perform                               @ Transaction.js:136
ReactDefaultBatchingStrategy.batchedUpdates @ ReactDefaultBatchingStrategy.js:62
batchedUpdates                              @ ReactUpdates.js:94
ReactEventListener.dispatchEvent            @ ReactEventListener.js:204

在档案ReactErrorUtils.js中:

if (process.env.NODE_ENV !== 'production') {
  /**
   * To help development we can get better devtools integration by simulating a
   * real browser event.
   */
  if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {
    var fakeNode = document.createElement('react');
    ReactErrorUtils.invokeGuardedCallback = function (name, func, a, b) {
      var boundFunc = func.bind(null, a, b);
      var evtType = 'react-' + name;
      fakeNode.addEventListener(evtType, boundFunc, false);
      var evt = document.createEvent('Event');
      evt.initEvent(evtType, false, false);
      // Line 71
      fakeNode.dispatchEvent(evt);
      fakeNode.removeEventListener(evtType, boundFunc, false);
    };
  }
}

似乎reactjs劫持了事件,并发送了缺少错误参数的新事件。

如何从错误中获取堆栈?

2 个答案:

答案 0 :(得分:1)

虽然这不应该发生,但可能是React的内部使用的类名与应用程序的类名冲突。我用Google搜索了问题并找到了一个论坛,其中有人通过更改他的班级名称修复了这个问题。

众所周知,React会提供误导性错误或给出令人惊讶的细节(即Invariant Error

答案 1 :(得分:1)

来自 React 16 的新更新。

当子组件内部出现错误时,会触发一个新的生命周期方法componentDidCatch