我一直在使用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
似乎不是标准的异常属性,而是现代浏览器的常用属性。
答案 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()
}
}