4

我知道 AngularJS 默认捕获所有应用程序异常,然后将它们记录到控制台。这使得 Chrome 中的“暂停未捕获的异常”按钮(我经常使用)毫无用处。

很多时候我在我的代码中遇到小的 javascript 错误(比如访问未定义变量的成员),我真的习惯于暂停异常并检查情况。

我现在唯一的解决方案是在触发错误的代码上放置一个断点(不切实际)或使用“暂停所有异常”按钮,但我必须继续处理 jQuery 默认生成的所有错误, Angular 和其他框架,这也很讨厌。

我还尝试覆盖 $exceptionHandler 服务,并在其中放置一个断点,但我无法从生成错误的函数中的调用堆栈访问。

那么,是否可以在 AngularJS 应用程序中使用“暂停未捕获的异常”?

4

3 回答 3

3

根据 Angular 文档,

https://docs.angularjs.org/api/ng/service/ $exceptionHandler

此示例将覆盖 $exceptionHandler 的正常操作,以使角度异常在发生时难以失败,而不仅仅是登录到控制台。

angular.module('exceptionOverride', []).factory('$exceptionHandler', function() {
  return function(exception, cause) {
    exception.message += ' (caused by "' + cause + '")';
    throw exception;
  };
});

这将导致它们由浏览器开发工具处理,这将允许暂停捕获的异常、使用源映射来获得良好的堆栈跟踪等。

大概您不希望在生产中发生这种情况,也不希望在开发过程中不断添加/删除此代码。我们通过在开发过程中添加并覆盖我们的生产代码的“开发”模块来解决这个次要问题。例如:

在 dev.html 中:

<html ng-app="devApp"> ...

在 dev.js 中:

angular.module('devApp', ['mainApp']) .factory('$exceptionHandler', ...)

于 2015-10-26T20:51:58.693 回答
1

Chrome 中不再提供“跳过源代码”,但是 - 有一个新选项 - 您可以右键单击源/源中的任何脚本并选择“黑盒脚本”。然后你就可以打开'Pause on Caught Exceptions',而不用担心 jQuery 和其他错误。就我个人而言,我总是在 jquery.js 和 angular.js 上使用它。

于 2014-12-04T10:06:34.197 回答
-1

您可以Skip stepping through sources with particular names在 DevTools 中启用并将其设置为如下所示:

(jquery|angular|diigolet)

在此处输入图像描述

于 2013-11-14T10:51:27.477 回答