我正在尝试处理angular js中的异常。我能够在一种情况下处理,但在某些情况下它无法处理原因?

实际上,当 undefined 任何内容时,它会捕获我的$ exceptionHandler。但是找不到文件时,它不会被$ exceptionHandler捕获
为什么


矮人
http://plnkr.co/edit/mm4Uix8XXVrkhexW15vR?p=preview

案例1

当我打这个

$http.get("default.json").then(successcallback, errorcallback);

成功alert(data.hhh.getname()); it is undefined which is catch by $ exceptionHandler并存储在array中。这是输出

案例2
但是,当我将文件default.son的名称更改为defaul.json时,为什么$ exceptionHandler无法捕获它?
并且它在控制台上显示404错误。我们可以捕获此错误并在控制台上打印吗?我们可以抓住这个错误..?

其实我不想收到这个错误

如何处理这个错误?

最佳答案

请参阅$exceptionHandler的文档。注意部分:

注意,在事件侦听器中执行的代码(即使是使用jqLit​​e的on / bind方法注册的代码)也不会将异常委托(delegate)给$ exceptionHandler(除非在摘要中执行)。

这意味着$exceptionHandler捕获了从digest cycle抛出的未捕获异常。但是,如果实际上单击抛出404的行,则应注意它是由XHR抛出的,它位于Angular的$apply之外,因此$exceptionHandler不在捕获它的范围内。另一方面,您的data.hhh.getname()位于$q成功回调中,该回调包含在$apply中,因此被$exeptionHandler捕获。

编辑
实际上article I linked for digest cycle可以更好地说明这一点。

请记住,您应该始终使用接受函数参数的$ apply()版本。这是因为当您将函数传递给$ apply()时,函数调用被包装在try ... catch块中,并且发生的任何异常都将传递给$ exceptionHandler服务。

这不仅仅是一个摘要循环,还需要在$apply的范围内。否则Angular将没有机会将try ... catch块放在任何地方以捕获异常并将其传递给$exceptionHandler

编辑经过仔细检查,您在控制台中看到的404也不例外。它是通过本地API XHR记录到console.error的。因此,您在控制台中看到的内容将必须保留且无法捕获。但是请注意,您始终可以在其失败回调中检查$http失败,因此可以注入(inject)$exceptionHandler(我看到您已自行配置)并手动登录。例如。

responseError: function(error){
    $exceptionHandler(new Error(
            error.config.method + ' ' +
            error.config.url + ' ' +
            error.status +' ' +
            '(' + error.statusText + ')'
    ));
    return $q.reject(error);
}

参见Plunker

10-05 20:16