我一直在使用Zone.js,我想为任何未捕获的异常设置日志记录。我可以设置一个错误处理程序,如下所示:
window.onerror = function(e) {
//send an error report to the server
}
但是如果在Promise中抛出异常,这将不起作用。关于Zone错误处理程序的好处是它挂钩到Promises并为它们中的异常触发,但是在创建区域之后我找不到实际覆盖或添加错误处理程序的方法,而不是覆盖一堆区域内的私人田地。
是否有可用于更新错误处理程序的区域的实际API,或者我是否必须更改构建根区域的polyfill或覆盖私有字段或类似内容?
答案 0 :(得分: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。
答案 1 :(得分:2)
for promise uncaught promise error,from zone.js 0.78,你可以使用这个API。
https://github.com/angular/zone.js/pull/627
border-right:0px solid #ddd;
height:85px;
box-shadow :5px 5px 10px 1px #eaeaea;
答案 2 :(得分:1)
如果要处理所有类型的未处理异常(在简单区域,setTimeouts或Promise等中),则必须在Zone上使用runGuarded
方法而不是run
。
以下是执行此操作的示例代码:
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');
});