Scala.js stacktraces

时间:2017-09-07 18:34:53

标签: scala.js

当我的Scala.js代码抛出异常时,我对无法理解的堆栈跟踪感到沮丧。我以为我有一个使用Javascript库的解决方案(参见Timo Huovinen),但它经常中断。

如何从如下所示的堆栈跟踪中提取意义(程序破坏的地方;它是如何实现的 - 就Scala代码而言)。或者我做错了甚至得到一个未翻译的堆栈跟踪?

Getting a scala stacktrace

1 个答案:

答案 0 :(得分:5)

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

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

简要概述

  1. 源map.js
  2.   

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

    1. 通过Ajax加载js.map文件
    2.   

      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
      2.   

        跟踪表示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. 处理错误
        2.   

          现在你有能力处理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中创建了此功能以简化操作。

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