2

フロントエンドのエラーを追跡するためにraygunを使用しています。Raygun は、プロパティにフックすることで EventError を悪用しwindow.onerrorます。ここまでは順調ですね。

私のアプリケーションは ES6 で書かれており、ジェネレーターを使用しています。私は、babelを使用して ES6 Web ブラウザーに準拠したコードを記述し、それをバンドルするwebpackを使用しています。私は使用しているので、HTML にgeneratorsBabel もインポートします。HTML ページが他のアプリケーションをロードし、ポリフィルを実行しようとする可能性があるため、アプリケーションにインポートしていません。そうすれば、ポリフィル インスタンスだけが実行されます。polyfillentry chunk

<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:
runApp@webpack:///../index.js?:86:11
initSteps$@webpack:///../index.js?:161:21
tryCatch@http://172.16.0.2/container/lib/polyfill.js:6151:37
invoke@http://172.16.0.2/container/lib/polyfill.js:6442:22
defineIteratorMethods/</prototype[method]@http://172.16.0.2/container/lib/polyfill.js:6203:16
resume@webpack:////Users/matteo/Documents/em3/container/web_src/lib/utils.js?:25:9
initSteps$/<@webpack:///../index.js?:148:25
run@http://172.16.0.2/container/lib/polyfill.js:3911:22
notify/<@http://172.16.0.2/container/lib/polyfill.js:3924:28
flush@http://172.16.0.2/container/lib/polyfill.js:1209:9
MutationCallback*[64]</module.exports@http://172.16.0.2/container/lib/polyfill.js:1228:5
[198]<@http://172.16.0.2/container/lib/polyfill.js:3837:26
s@http://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
s@http://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
s@http://172.16.0.2/container/lib/polyfill.js:1:246
e@http://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');、ジェネレーター関数の外に移動すると、予想されるアラートが表示されます。この動作を回避するにはどうすればよいですか?

4

1 に答える 1

1

ジェネレーター内でスローされたエラーは promise コンテキストから発生したようであり、未処理の promise 拒否は、キャッチされていない同期エラーとは異なる方法で処理されます。

キャッチされていない promise の拒否をキャッチするには、たとえば次のように使用できます。

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

一部の古いポリフィルまたは古いネイティブの promise では、代わりに次のことを行う必要がある場合があります。

window.onunhandledrejection = function(event) { ...};
于 2017-01-31T16:04:43.370 に答える