Javascript 我可以在kotlin js中获取异常stacktrace吗?
我一直在用kotlin js为应用程序编写简单的web前端,并面临异常处理问题。 如我所见,没有API可以获取异常stacktrace: 是这样吗? 如果是,可能有人知道从Throwable对象中获取stacktrace的一些库或代码片段吗 目前,我有一些解决方法:Javascript 我可以在kotlin js中获取异常stacktrace吗?,javascript,exception,stack-trace,kotlin-js,Javascript,Exception,Stack Trace,Kotlin Js,我一直在用kotlin js为应用程序编写简单的web前端,并面临异常处理问题。 如我所见,没有API可以获取异常stacktrace: 是这样吗? 如果是,可能有人知道从Throwable对象中获取stacktrace的一些库或代码片段吗 目前,我有一些解决方法: import kotlin.browser.window fun main() { window.onload = { try { throw RuntimeException()
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:似乎
堆栈
不是标准的异常属性,而是现代浏览器的常见属性。只需将控制台.log
更改为控制台.error
import kotlin.browser.window
fun main() {
window.onload = {
try {
throw RuntimeException()
} catch (e: Throwable) {
console.error(e) // change here
throw e
}
}
}
不完美,不标准,但很有效。
它还处理Firefox中的源代码映射,因此我得到了正确的文件名和行号:
试试看{
抛出非法状态异常(“ops…”)
}
捕获(例如:可丢弃){
val stack=ex.asDynamic().stack
if(堆栈是字符串){
val error=js(“error()”)
error.name=ex.toString().substringBefore(':'))
error.message=ex.message?.substringAfter(“:”)
error.stack=堆栈
控制台错误(错误)
}否则{
控制台日志(ex)
}
}
自Kotlin 1.4以来,stdlib包含两个用于此目的的扩展
fun-Throwable.stackTraceToString()
fun-Throwable.printStackTrace()
用这些我们可以写
window.onload = {
try {
throw RuntimeException()
} catch (e: Throwable) {
e.printStackTrace()
}
}