我可以在kotlin-js中获取异常stacktrace吗?

时间:2019-06-23 09:20:10

标签: javascript exception stack-trace kotlin-js

我一直在使用kotlin-js为应用程序编写简单的Web前端,并且遇到异常处理问题。 如我所见,没有API可以获取异常stacktrace:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-throwable/index.html 是这样吗? 如果是这样,也许有人知道一些库或代码片段可以从Throwable对象中获取stacktrace吗?

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

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似乎不是标准的异常属性,而是现代浏览器的常用属性。

3 个答案:

答案 0 :(得分:0)

只需将您的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
        }
    }
}

答案 1 :(得分:0)

不是完美的,不是标准的,但是可以。
它还可以处理Firefox中的源地图,因此我可以获得正确的文件名和行号:

var formatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
});

formatter.format(2500)

答案 2 :(得分:0)

自Kotlin 1.4起,stdlib为此目的包含两个扩展 fun Throwable.stackTraceToString()
fun Throwable.printStackTrace()

使用这些我们可以编写

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