当我的Scala.js代码抛出异常时,我对无法理解的堆栈跟踪感到沮丧。我以为我有一个使用Javascript库的解决方案(参见Timo Huovinen),但它经常中断。
你如何从如下所示的堆栈跟踪中提取意义(程序破坏的地方;它是如何实现的 - 就Scala代码而言)。或者我做错了甚至得到一个未翻译的堆栈跟踪?
答案 0 :(得分:5)
看看我在我的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
跟踪表示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中创建了此功能以简化操作。
不像我希望的那样简短概述,但这不是一个简单的问题需要解决。源映射GitHub项目(https://github.com/mozilla/source-map)有很好的文档,是我最初用来编写我的解决方案(添加了一些试验和错误)。如果我提供的信息不完整,我建议您阅读更多信息,因为它应该提供大部分信息,并且可能更好地解释。