【问题标题】:How can I get more stacktrace in AngularJS如何在 AngularJS 中获得更多堆栈跟踪
【发布时间】:2014-09-05 17:47:30
【问题描述】:

我正在使用装饰器来更改$exceptionHandler 的行为,将日志发送到服务器。我的问题是异常的堆栈跟踪似乎没用,只显示堆栈的一部分。例如:

语法错误:标记“未定义”不是 NaN 列的主表达式 的表达式[这里的表达式]。

at Error (native)
at throwError (http://localhost:8080/angular/angular.js:6674:62)
at primary (http://localhost:8080/angular/angular.js:6918:9)
at unary (http://localhost:8080/angular/angular.js:6900:14)
at multiplicative (http://localhost:8080/angular/angular.js:6883:16)
at additive (http://localhost:8080/angular/angular.js:6874:16)
at relational (http://localhost:8080/angular/angular.js:6865:16)
at equality (http://localhost:8080/angular/angular.js:6856:16)
at logicalAND (http://localhost:8080/angular/angular.js:6847:16)
at logicalOR (http://localhost:8080/angular/angular.js:6839:41)

有没有办法配置 AngularJS 以显示更多堆栈?如果我查看 Chrome 控制台,我可以看到更多堆栈,并获取文件名,但不在异常处理程序中。

即使我更改了Error 限制,我也看不到原始文件:

Error.stackTraceLimit = Infinity;

【问题讨论】:

  • 没有已知的方法可以做到这一点。
  • 今年冬天我参加了 Ng-Conf,Angular 团队在 zone.js 上做了一个演示。我没有研究它,所以我不知道它有多相关,但也许值得探索。 thechangelog.com/zone-js(顺便说一句,那不是我的博客,只是用谷歌搜索了它)
  • 你是使用'throw new Error("error description")'还是'throw "error description"'来抛出错误?如果你抛出一个 Error 对象,它会提供更多信息。
  • 你能在这里提供你的 $exceptionHandler 装饰器的实现吗?
  • 那是 Angular 的一部分,真的很糟糕......堆栈跟踪比通常更没用

标签: angularjs exception


【解决方案1】:

1 使用调试器,而不是 Chrome 控制台

Google Chrome 提供了一个调试器,可以帮助 JS 程序员找到错误和有问题的代码。

随着 JavaScript 应用程序复杂性的增加,开发人员需要 强大的调试工具,帮助快速发现故障原因 问题并有效地修复它。 Chrome DevTools 包括几个 有用的工具可以帮助减少调试 JavaScript 的痛苦。

你可以尝试在任何你想要的地方放置一些断点(尝试检测有问题的行/方法)。

查看官方文档:Google Chrome Debugger

2 使用浏览器扩展

ng-inspectorAngularJS Batarang 等许多插件可帮助您打印 AngularJS 程序的状态(控制器实例、变量名称/值和范围)。

3 使用 $log 服务(console.log 包装器)

AngularJS $log 服务提供了一个简单的资源,用于在浏览器控制台(如果存在)中打印变量的状态。

简单的日志服务。默认实现安全地写入 消息进入浏览器的控制台(如果存在)。

此服务的主要目的是简化调试和 疑难解答。

默认是记录调试消息。您可以使用 ng.$logProvider#debugEnabled 来改变它。 AngularJS $日志服务 帮助您调试程序。


在我看来,一个好的 AngularJS 调试包括以上所有解决方案的组合。

希望对你有用。

【讨论】:

  • 缺少堆栈跟踪使调试工具毫无用处。如果 OP 知道放置断点的行号,我认为他不会问这个问题。
  • 我不反对这个答案,因为它仍然有有用的信息,但它并没有真正解决问题。我还需要更长的堆栈跟踪来确定 my 代码中的哪一行正在生成错误。我想我也许可以使用调试器一路返回到我的代码,但这感觉效率很低。
  • @rinogo 你找到方法了吗?我讨厌我找不到导致错误的代码行
  • @Amon - 我没有给你任何东西。 ? 我想我只是求助于老式的“调试”技术,比如注释掉代码部分,并在有问题的代码中调用 console.log 来解决问题。抱歉,我帮不上忙!
  • @rinogo 没关系!我在调试器中使用断点,你为什么不使用它?我一直在寻找代码中出现错误的根源,但实际上我认为它来自扩展。根据断点,这样有意义吗?
猜你喜欢
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 2019-08-05
  • 2012-03-02
  • 2020-12-03
  • 2022-07-07
  • 2013-02-24
  • 2010-09-11
相关资源
最近更新 更多