Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以在kotlin js中获取异常stacktrace吗?_Javascript_Exception_Stack Trace_Kotlin Js - Fatal编程技术网

Javascript 我可以在kotlin js中获取异常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()

我一直在用kotlin js为应用程序编写简单的web前端,并面临异常处理问题。 如我所见,没有API可以获取异常stacktrace: 是这样吗? 如果是,可能有人知道从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:似乎
堆栈
不是标准的异常属性,而是现代浏览器的常见属性。

只需将
控制台.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()
        }
    }