【问题标题】:Getting a scala stacktrace获取 Scala 堆栈跟踪
【发布时间】:2017-06-07 05:15:43
【问题描述】:

当我的 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 堆栈跟踪?

【问题讨论】:

  • 此代码在某处可用吗?我有兴趣自己使用它。
  • 我在gist.github.com/bwbecker/e92324dc8875e10f44b5161c2515a186 提出了要点。请注意,这仍在进行中。我的注意力转移到了其他东西上,所以发布的代码仍然很粗糙。如果有用,那就太好了。欢迎提供反馈。

标签: scala.js


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    公共 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 主要版本中更改,恕不另行通知。如果它消失了,它将被可靠的东西所取代。与此同时,以上内容应该能让你继续前进。

    【讨论】:

    • 太棒了!谢谢!
    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2010-11-10
    • 2018-08-10
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多