我可以在 kotlin-js 中获得异常堆栈跟踪吗?
Can I get exception stacktrace in kotlin-js?
我一直在为使用 kotlin-js 的应用程序编写简单的 Web 前端,但遇到了异常处理问题。
如我所见,没有 API 获取异常堆栈跟踪:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-throwable/index.html
是这样吗?
如果是,可能有人知道一些库或代码片段可以从 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代码,没有源代码很难使用映射回科特林。
UPD:似乎 stack
不是标准异常 属性,而是现代浏览器的常见异常。
只需将您的 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
}
}
}
不完美,不标准,但有效。
它还处理 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)
}
}
自 Kotlin 1.4 起,stdlib 包含两个用于此确切目的的扩展
fun Throwable.stackTraceToString()
fun Throwable.printStackTrace()
使用这些我们可以写
window.onload = {
try {
throw RuntimeException()
} catch (e: Throwable) {
e.printStackTrace()
}
}
我一直在为使用 kotlin-js 的应用程序编写简单的 Web 前端,但遇到了异常处理问题。 如我所见,没有 API 获取异常堆栈跟踪:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-throwable/index.html 是这样吗? 如果是,可能有人知道一些库或代码片段可以从 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代码,没有源代码很难使用映射回科特林。
UPD:似乎 stack
不是标准异常 属性,而是现代浏览器的常见异常。
只需将您的 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
}
}
}
不完美,不标准,但有效。
它还处理 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)
}
}
自 Kotlin 1.4 起,stdlib 包含两个用于此确切目的的扩展
fun Throwable.stackTraceToString()
fun Throwable.printStackTrace()
使用这些我们可以写
window.onload = {
try {
throw RuntimeException()
} catch (e: Throwable) {
e.printStackTrace()
}
}