我正在尝试处理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的文档。注意部分:
注意,在事件侦听器中执行的代码(即使是使用jqLite的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