2016-08-31 4 views
4

Я работал с Zone.js, и я хочу настроить ведение журнала для любых неперехваченных исключений. Я мог бы создать обработчик ошибок, например, так:Пользовательский обработчик ошибок в Zone.js

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

Но это не будет работать, если исключение внутри Promise. Самое приятное в обработчике ошибок Zone - это то, что он перехватывает Promise и делает огонь для исключений в них, но я не могу найти способ фактически переопределить или добавить обработчик ошибок после того, как Zone был создан, кроме переопределения группы частные поля в Зоне.

Существует ли реальный API для зоны, которую я могу использовать для обновления обработчика ошибок, или мне нужно изменить полиполк, где создана корневая зона, или перезаписать частные поля или что-то подобное?

+0

Вы можете сохранить ссылку на 'Promise' конструктора перед выполнением Zone.js сценария. –

+0

@ SoftwareEngineer171 Я не вижу, как это помогает мне. –

ответ

2

Вы могли бы попробовать что-то вроде этого:

<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> 

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

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

Однако, кажется, он не работает если исключения выбрасываются непосредственно в зону. Я подал и issue об этом.

0

для обещания обезвреженной ошибки обещания, from zone.js 0.78, вы можете использовать этот API.

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); 
}); 
Смежные вопросы