如何使用 Chrome DevTools 在 AngularJS 异常中暂停脚本执行?

Posted

技术标签:

【中文标题】如何使用 Chrome DevTools 在 AngularJS 异常中暂停脚本执行?【英文标题】:How to pause the script execution in AngularJS exceptions using Chrome DevTools? 【发布时间】:2013-11-27 05:45:19 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

(jquery|angular|diigolet)

【讨论】:

这似乎没有解决实际问题 - 您不能在 Angular 代码中“暂停未捕获的异常”,因为 Angular 会捕获异常并且不会重新抛出它们。我猜(基于对这个问题的另一个答案)如果启用该模式,您可以使用它来减少必须跳过的无关捕获异常的数量。【参考方案2】:

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

【讨论】:

【参考方案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 中:

...

在 dev.js 中:

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

【讨论】:

以上是关于如何使用 Chrome DevTools 在 AngularJS 异常中暂停脚本执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Chrome DevTools 在 AngularJS 异常中暂停脚本执行?

如何在没有 ADB 的情况下使用 Chrome Devtools?

Chrome >=24 - 如何将 devtools 停靠在右侧?

Chrome >=24 - 如何将 devtools 停靠在右侧?

如何从我使用 Chrome DevTools 访问的任何网站中挑选颜色?

如何检查 chrome devtools 中的所有 cookie?