2017-01-31 14 views
2

Я использую raygun, чтобы отслеживать ошибки моего front-end. Raygun использует EventError, подключившись к свойству window.onerror. Все идет нормально.babel polyfill ловит мои ошибки вместо того, чтобы пустить их пузырь

Мое приложение написано на ES6 и использует генераторы. Я использую babel, чтобы написать код, совместимый с веб-браузером ES6, и webpack, чтобы связать его. Поскольку я использую generators, я также импортирую Babel polyfill в свой HTML вместе с моим entry chunk. Я не импортирую его в свое приложение, потому что HTML-страница может загружать другие приложения, что, в свою очередь, может попытаться запустить полипол. Таким образом, запускается только экземпляр polyfill.

<script src="/container/lib/polyfill.js"></script> 
<script src="/container/vendor.bundle.js"></script> 
<script src="/container/myApp.js"></script> 

Чтобы убедиться window.onerror работы, я первый написал свой собственный обработчик ошибок (ну, я скопировал из MDN):

window.onerror = function (msg, url, lineNo, columnNo, error) { 
    var string = msg.toLowerCase(); 
    var substring = "script error"; 
    if (string.indexOf(substring) > -1){ 
     alert('Script Error: See Browser Console for Detail'); 
    } else { 
     var message = [ 
      'Message: ' + msg, 
      'URL: ' + url, 
      'Line: ' + lineNo, 
      'Column: ' + columnNo, 
      'Error object: ' + JSON.stringify(error) 
     ].join(' - '); 

     alert(message); 
    } 

    return false; 
}; 

так, запустив свой код, я бы ожидать замечательный старинный сигнал.

К сожалению, то, что я получаю это сообщение в моем журнале ошибок, но window.onerror крючок не поймать его:

Unhandled promise rejection Error: test 
Analisi dello stack: 
[email protected]:///../index.js?:86:11 
[email protected]:///../index.js?:161:21 
[email protected]://172.16.0.2/container/lib/polyfill.js:6151:37 
[email protected]://172.16.0.2/container/lib/polyfill.js:6442:22 
defineIteratorMethods/</prototype[method]@http://172.16.0.2/container/lib/polyfill.js:6203:16 
[email protected]:////Users/matteo/Documents/em3/container/web_src/lib/utils.js?:25:9 
initSteps$/<@webpack:///../index.js?:148:25 
[email protected]://172.16.0.2/container/lib/polyfill.js:3911:22 
notify/<@http://172.16.0.2/container/lib/polyfill.js:3924:28 
[email protected]://172.16.0.2/container/lib/polyfill.js:1209:9 
MutationCallback*[64]</[email protected]://172.16.0.2/container/lib/polyfill.js:1228:5 
[198]<@http://172.16.0.2/container/lib/polyfill.js:3837:26 
[email protected]://172.16.0.2/container/lib/polyfill.js:1:246 
s/<@http://172.16.0.2/container/lib/polyfill.js:1:305 
[295]<@http://172.16.0.2/container/lib/polyfill.js:6017:1 
[email protected]://172.16.0.2/container/lib/polyfill.js:1:246 
s/<@http://172.16.0.2/container/lib/polyfill.js:1:305 
[1]</<@http://172.16.0.2/container/lib/polyfill.js:5:1 
[1]<@http://172.16.0.2/container/lib/polyfill.js:2:2 
[email protected]://172.16.0.2/container/lib/polyfill.js:1:246 
[email protected]://172.16.0.2/container/lib/polyfill.js:1:425 
@http://172.16.0.2/container/lib/polyfill.js:1:11 

в то время как, если я перееду мой throw new Error('test'); вне моей функции генератора, я получаю ожидаемый сигнал тревога , Как я могу избежать такого поведения?

ответ

1

Похоже, что ошибки, возникающие внутри вашего генератора, происходят из контекста обещаний, а необработанные обещания отклонения обрабатываются по-другому, чем ошибки uncached sync.

Чтобы поймать неперехваченное отказ обещание вы можете использовать, например, следующее:

window.addEventListener("unhandledrejection", function (event) { 
    console.warn("WARNING: Unhandled promise rejection. Reason: " 
       + event.reason); 
}); 

С некоторых старых polyfills или старых родных обещаний вы, возможно, придется выполнить следующие действия вместо:

window.onunhandledrejection = function(event) { ...}; 
+0

сделал вы заметили строку 'tryCatch @ http: //172.16.0.2/container/lib/polyfill.js: 6151: 37'? Я думаю, polyfill.js ловит все – Bertuz