【发布时间】:2017-09-12 22:28:09
【问题描述】:
当我的 Scala.js 代码引发异常时,我对无法理解的堆栈跟踪感到沮丧。我以为我有一个使用 Javascript 库的解决方案(请参阅 Getting a scala stacktrace),但它经常中断。
你如何从堆栈跟踪中提取含义(程序在哪里中断;它是如何到达那里的——就 Scala 代码而言),如下所示。还是我做错了什么,甚至得到了未翻译的堆栈跟踪?
【问题讨论】:
标签: scala.js
当我的 Scala.js 代码引发异常时,我对无法理解的堆栈跟踪感到沮丧。我以为我有一个使用 Javascript 库的解决方案(请参阅 Getting a scala stacktrace),但它经常中断。
你如何从堆栈跟踪中提取含义(程序在哪里中断;它是如何到达那里的——就 Scala 代码而言),如下所示。还是我做错了什么,甚至得到了未翻译的堆栈跟踪?
【问题讨论】:
标签: scala.js
看看我不久前在我的 youi 框架中写的这段代码:https://github.com/outr/youi/tree/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/sourceMap
它用于将 JS 堆栈跟踪反转为 Scala 堆栈跟踪。在 youi 中,我将错误发送到服务器,以便我可以通过完整的回溯监控发生的浏览器错误。
简要概述
你需要 source-map.js 来解析 Scala.js 的 js.map 文件 在编译您的代码时生成。看: https://github.com/mozilla/source-map
SourceMapConsumer需要 js.map 文件的js.Object(JSON)。有关通过 youi 的 Ajax 功能加载的示例,请参阅 https://github.com/outr/youi/blob/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/sourceMap/ErrorTrace.scala#L58。
Throwable
trace 代表 JS 文件中的行和列,可以通过 将该信息发送给
SourceMapConsumer以获取原始的 Scala 行 回号码(见SourceMapConsumer.originalPositionFor)。看ErrorTrace.toCause(https://github.com/outr/youi/blob/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/sourceMap/ErrorTrace.scala#L98) 以迭代Throwable的跟踪元素为例。
现在您有能力处理 JavaScript 错误和 将它们转换回 Scala 跟踪,您需要实际接收 错误。如果要全局处理未捕获的错误,请设置一个函数 到
window.onerror以捕获错误。在撰写本文时, Scala.js 中的函数签名并不适合处理所有 信息,所以在你我使用js.Dynamic将其设置为我需要的 (看: https://github.com/outr/youi/blob/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/ClientApplication.scala#L35)。 另外,请注意ErrorTrace它支持多种传入类型 错误(ErrorEvent、Throwable和更通用的场景)。 这是因为在 JavaScript 中,错误以不同的方式出现 关于正在发生的事情。这是一个相当复杂的话题,为什么我 在 youi 中创建了这个功能来简化事情。
没有我希望的那么简短的概述,但这不是一个简单的问题要解决。 source-map GitHub 项目 (https://github.com/mozilla/source-map) 有不错的文档,是我最初用来编写我的解决方案的文件(添加了一些试验和错误)。如果我提供的信息不完整,我建议您在那里阅读更多信息,因为它应该提供大部分信息,并且可能会得到更好的解释。
【讨论】: