我正在尝试处理角度js中的异常。我能够在一个场景中处理但是在场景中它无法处理为什么?
实际上当任何未定义的东西时,它会捕获我的$ exceptionHandler.But当找不到文件时它不会被$ exceptionHandler捕获 为什么
实施例 plunker 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并存储在数组中。这是输出
案例2 但是当我将文件default.son的名称更改为defaul.json时,它是不是被$ exceptionHandler捕获为什么? 它在console.can上显示404错误我们捕获此错误并在控制台上打印?我们可以抓住这个错误..?
其实我不想收到此错误
如何处理此错误?
答案 0 :(得分:1)
请参阅$exceptionHandler的文档。请注意部分:
注意,在事件监听器中执行的代码(即使是那些使用jqLite' s on / bind方法注册的代码)也不会将异常委托给$ 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甚至不是例外。它由XHR console.error
登录到$http
,这是一个原生API。所以你在控制台看到的东西必须留下来,不能被抓住。但请注意,您始终可以在其故障回调中检查$exceptionHandler
失败,因此您可以注入responseError: function(error){
$exceptionHandler(new Error(
error.config.method + ' ' +
error.config.url + ' ' +
error.status +' ' +
'(' + error.statusText + ')'
));
return $q.reject(error);
}
(我看到您已自行配置)并手动使用它进行登录。例如
<?php get_header('nofound'); ?>
请参阅Plunker