获取 Scala 堆栈跟踪

Getting a scala stacktrace

当我的 scala-js 代码抛出错误时,我想将一个合理的堆栈跟踪发送回我的服务器以放入日志中。 "sensible stacktrace" 我的意思是提供 Scala 方法、文件名和行号的东西,而不是转译的 javascript 代码。

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

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

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

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

有没有我完全忽略的另一种方法?任何内置于 scala-js 中的东西都可以将 javascript 堆栈跟踪转换为 Scala 堆栈跟踪?

publicAPI中没有任何内容可以访问列号,因为这是一个JavaAPI,而Scala.js不能添加public 成员到 Java APIs.

为了解决 StackTraceElement 中的这个问题,我们 getColumnNumber(): Int 导出到 Java 脚本。因此,您可以使用以下代码来检索列号:

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

请注意,此 "feature" 未记录在案,可能会在 Scala.js 的未来主要版本中更改,恕不另行通知。如果它消失了,它将被可靠的东西取代。与此同时,以上内容应该可以让您继续前进。

我随后找到了 StackTraceJS library which does what I needed. I combined a ScalaJS facade for it with a facade for JSNlog to come up with a package that meets my needs pretty well. See jsnlog-facade。它使用 Scala 堆栈跟踪记录到浏览器控制台 and/or 服务器。包含演示代码。