【问题标题】:Scala.js stacktracesScala.js 堆栈跟踪
【发布时间】:2017-09-12 22:28:09
【问题描述】:

当我的 Scala.js 代码引发异常时,我对无法理解的堆栈跟踪感到沮丧。我以为我有一个使用 Javascript 库的解决方案(请参阅 Getting a scala stacktrace),但它经常中断。

如何从堆栈跟踪中提取含义(程序在哪里中断;它是如何到达那里的——就 Scala 代码而言),如下所示。还是我做错了什么,甚至得到了未翻译的堆栈跟踪?

【问题讨论】:

    标签: scala.js


    【解决方案1】:

    看看我不久前在我的 youi 框架中写的这段代码:https://github.com/outr/youi/tree/e66dc36a12780fa8941152d07de9c3a52d28fc10/app/js/src/main/scala/io/youi/app/sourceMap

    它用于将 JS 堆栈跟踪反转为 Scala 堆栈跟踪。在 youi 中,我将错误发送到服务器,以便我可以通过完整的回溯监控发生的浏览器错误。

    简要概述

    1. source-map.js

    你需要 source-map.js 来解析 Scala.js 的 js.map 文件 在编译您的代码时生成。看: https://github.com/mozilla/source-map

    1. 通过 Ajax 加载 js.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

    1. 处理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 的跟踪元素为例。

    1. 处理错误

    现在您有能力处理 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 它支持多种传入类型 错误(ErrorEventThrowable 和更通用的场景)。 这是因为在 JavaScript 中,错误以不同的方式出现 关于正在发生的事情。这是一个相当复杂的话题,为什么我 在 youi 中创建了这个功能来简化事情。

    没有我希望的那么简短的概述,但这不是一个简单的问题要解决。 source-map GitHub 项目 (https://github.com/mozilla/source-map) 有不错的文档,是我最初用来编写我的解决方案的文件(添加了一些试验和错误)。如果我提供的信息不完整,我建议您在那里阅读更多信息,因为它应该提供大部分信息,并且可能会得到更好的解释。

    【讨论】:

    • 谢谢。在高层次上,代码对我来说很有意义。完成当前任务后,我会喜欢深入研究它。对于那些关注我的人,在第 35 行的 ClientApplication 中找到错误处理程序的安装很有帮助。
    • 你能用更稳定的链接巩固这个答案吗?指向 master 的指针可能会在未来中断。理想情况下,甚至应该在此处复制最重要的 sn-ps 以遵循 SO 的建议,除非它们真的太长。
    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2018-09-19
    • 2016-12-17
    相关资源
    最近更新 更多