Zone.js中的自定义错误处理程序

时间:2016-08-31 23:39:09

标签: javascript angular typescript zonejs

我一直在使用Zone.js,我想为任何未捕获的异常设置日志记录。我可以设置一个错误处理程序,如下所示:

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

但是如果在Promise中抛出异常,这将不起作用。关于Zone错误处理程序的好处是它挂钩到Promises并为它们中的异常触发,但是在创建区域之后我找不到实际覆盖或添加错误处理程序的方法,而不是覆盖一堆区域内的私人田地。

是否有可用于更新错误处理程序的区域的实际API,或者我是否必须更改构建根区域的polyfill或覆盖私有字段或类似内容?

3 个答案:

答案 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');
});