Pertanyaan Penangan kesalahan kustom di Zone.js


Saya telah bekerja dengan Zone.js dan saya ingin mengatur penebangan untuk pengecualian yang tidak tertangkap. Saya dapat mengatur penanganan kesalahan, seperti:

window.onerror = function(e) { 
    //send an error report to the server
}

Tapi ini tidak akan berhasil jika pengecualian dilemparkan ke dalam Janji. Hal yang baik tentang pengendali kesalahan Zona adalah bahwa itu kait ke Janji dan melakukan api untuk pengecualian di dalamnya, tetapi saya tidak dapat menemukan cara untuk benar-benar menimpa atau menambahkan pengendali kesalahan setelah Zona telah dibuat selain mengesampingkan sekelompok bidang pribadi di Zona.

Apakah ada API aktual untuk Zona yang dapat saya gunakan untuk memperbarui pengendali kesalahan, atau apakah saya harus mengubah polyfill di mana root Zone dibangun atau menimpa bidang pribadi atau yang serupa?


5
2017-08-31 23:39


asal


Jawaban:


Anda dapat mencoba sesuatu seperti ini:

<html>
<head>
<script src="https://unpkg.com/zone.js?main=browser"></script>
<script>
Zone.current.fork({
    onHandleError: function(parentZoneDelegate, currentZone, targetZone, error) {
        console.log("Error handled by zone: " + error);
    }
}).run(function () {
    setTimeout(function () {
        console.log("In zone setTimeout")
        throw new Error("Throw in zone setTimeout"); 
    }, 0);
    console.log("Directly in zone");
});
</script>
</head>
<body>
</body>
</html>

Yang akan menangkap pengecualian dalam penangan khusus yang ditentukan oleh onHandleError dan hasil keluaran seperti ini:

Directly in zone (test1.html:14)
In zone setTimeout (test1.html:11 )
Error handled by zone: Error: Throw in zone setTimeout (test1.html:7)

Namun tampaknya itu tidak berhasil jika pengecualian dilempar langsung di zona itu. Saya telah mengajukan dan isu tentang ini.


2
2017-09-07 17:34



untuk janji kesalahan janji yang tidak tertangkap, dari zone.js 0.78, Anda dapat menggunakan API ini.

https://github.com/angular/zone.js/pull/627

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

window.addEventListener("rejectionhandled", function (event) {
  console.log("Promise rejected! Reason: " + reason);
});

2
2018-03-12 13:10



Anda harus menggunakan runGuarded metode bukan run di Zone jika Anda ingin menangani semua jenis pengecualian yang tidak tertangani (di zona sederhana, di setTimeouts atau dalam Janji, dll.)

Berikut ini contoh kode untuk melakukannya:

Zone.current.fork({
  name: 'MyGlobalErrorLoggerZone',
  onHandleError: function(parentZoneDelegate, currentZone, targetZone, error){
     console.log(error);
     // send it to server here.
  }
})
.runGuarded(function(){
   // your application code here...
   // handles errors inside promises
   new Promise(function(resolve, reject){
        reject('Rejecting: Some Error');
   });
    console.log('Running in Zone...', Zone.current.name);
    // handles errors inside timeouts/intervals
    setTimeout(function(){
            console.log('after 1 sec', Zone.current.name);
            throw new Error('This is an error. Make your self log me please.');
    }, 1000);
    // Handles errors throw directly in zone too.
    throw new Error('oops, one more error');
});

1
2018-03-24 09:55