【问题标题】:Can I get exception stacktrace in kotlin-js?我可以在 kotlin-js 中获取异常堆栈跟踪吗?
【发布时间】:2019-11-05 10:23:38
【问题描述】:

我一直在使用 kotlin-js 为应用程序编写简单的 Web 前端,但遇到了异常处理的问题。 如我所见,没有 API 可以获取异常堆栈跟踪:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-throwable/index.html 是这样吗? 如果是,可能有人知道一些库或 sn-ps 从 Throwable 对象中获取堆栈跟踪吗?

目前,我有一些解决方法:

import kotlin.browser.window

fun main() {
    window.onload = {
        try {
            throw RuntimeException()
        } catch (e: Throwable) {
            console.log(e)
            throw e
        }
    }
}

控制台输出是:

Object { 
"message_8yp7un$_0": null, 
"cause_th0jdv$_0": null, 
"stack": "captureStack@http://localhost:9080/js/kotlin.js:1767:27\nException@http://localhost:9080/js/kotlin.js:3244:14\nRuntimeException@http://localhost:9080/js/kotlin.js:3255:17\nRuntimeException_init@http://localhost:9080/js/kotlin.js:3261:24\nmain$lambda@http://localhost:9080/js/web-client.js:34:13\n",
"name": "RuntimeException"
}

这里,console.log(Throwable) 暴露了底层的 JavaScript 对象属性,还有 stack 一个,但它指向 JavaScript 代码,如果没有回溯到 kotlin 的源映射就很难使用。

UPD:似乎stack 不是标准异常属性,而是现代浏览器常见的属性。

【问题讨论】:

    标签: javascript exception stack-trace kotlin-js


    【解决方案1】:

    只需将您的 console.log 更改为 console.error

    import kotlin.browser.window
    
    fun main() {
        window.onload = {
            try {
                throw RuntimeException()
            } catch (e: Throwable) {
                console.error(e) // change here
                throw e
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      不完美,不标准,但它有效。
      它还处理 Firefox 中的源映射,因此我得到了正确的文件名和行号:

      try {
          throw IllegalStateException("ops...")
      } 
      catch (ex : Throwable) {
          val stack = ex.asDynamic().stack
          if (stack is String) {
              val error = js("Error()")
              error.name = ex.toString().substringBefore(':')
              error.message = ex.message?.substringAfter(':')
              error.stack = stack
              console.error(error)
          } else {
              console.log(ex)
          }
      }
      

      【讨论】:

        【解决方案3】:

        从 Kotlin 1.4 开始,stdlib 包含两个用于此目的的扩展 fun Throwable.stackTraceToString()
        fun Throwable.printStackTrace()

        使用这些我们可以写

            window.onload = {
                try {
                    throw RuntimeException()
                } catch (e: Throwable) {
                    e.printStackTrace()
                }
            }
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-01
          • 2021-11-04
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2015-03-17
          • 2014-03-04
          相关资源
          最近更新 更多