获取scala stacktrace

时间:2017-01-10 14:50:15

标签: scala.js

当我的scala-js代码抛出错误时,我想将一个合理的堆栈跟踪发送回我的服务器以放入日志。通过“合理的堆栈跟踪”,我的意思是提供Scala方法,文件名和行号,而不是转换后的javascript代码。

通过获取源映射并使用Javascript源映射库(https://github.com/mozilla/source-map)将堆栈跟踪的每个元素从javascript转换为相应的Scala代码,我取得了很好的进展。

我的问题:我需要抛出错误的javascript代码的列号,但不知道如何获取它。打印StackTraceElement会产生类似于

的结果
oat.browser.views.query.QueryRunView$.renderParamsTable$1(https://localhost:9443/assets/browser-fastopt.js:34787:188)

我需要行末尾的“188”,但除了调用toString并解析结果之外,我不知道如何获取它。查看StackTraceElement代码,列号是一个私有变量,API中没有任何内容可以访问它。

还有另一种方法,我完全忽略了吗?在scala-js中内置了一个将javascript堆栈跟踪转换为Scala堆栈跟踪的东西吗?

2 个答案:

答案 0 :(得分:1)

公共API中没有任何内容可以访问列号,因为这是一个Java API,并且Scala.js无法将公共成员添加到Java API。

要在StackTraceElement的情况下解决此问题,我们 getColumnNumber(): Int导出到JavaScript。因此,您可以使用以下代码检索列号:

def columnNumberOfStackTraceElement(ste: StackTraceElement): Int =
  ste.asInstanceOf[js.Dynamic].getColumnNumber().asInstanceOf[Int]

请注意这个"功能"没有文档,可能会在未来的主要版本的Scala.js中更改,恕不另行通知。如果它消失了,它将被可靠的东西取代。与此同时,上述内容应该让你前进。

答案 1 :(得分:1)

我后来找到了StackTraceJS库来完成我需要的工作。我将ScalaJS外观与JSNlog的外观相结合,提出了一个能很好地满足我需求的软件包。见jsnlog-facade。它使用Scala堆栈跟踪记录到浏览器控制台和/或服务器。包含演示代码。