原创

Kotlin异常的跟踪栈

异常对象的printStackTrace()方法用于打印异常的跟踪栈信息,根据printStackTrace()方法的输出结果,可以找到异常的源头,并跟踪到异常出发的过程。

class SelfException : Exception {
    constructor() {}

    constructor(msg: String) : super(msg) {}
}

class PrintStackTraceTest {

    fun firstMethod() {
        secondMethod()
    }

    fun secondMethod() {
        thirdMethod()
    }

    fun thirdMethod() {
        throw SelfException("自定义异常信息")
    }
}

fun main(args: Array<String>) {
    PrintStackTraceTest().firstMethod()
}

输出结果:

Exception in thread "main" 0708.SelfException: 自定义异常信息
	at 0708.PrintStackTraceTest.thirdMethod(PrintStackTraceTest.kt:20)
	at 0708.PrintStackTraceTest.secondMethod(PrintStackTraceTest.kt:16)
	at 0708.PrintStackTraceTest.firstMethod(PrintStackTraceTest.kt:12)
	at 0708.PrintStackTraceTestKt.main(PrintStackTraceTest.kt:25)

异常从thirdMethod()方法开始触发,传到secondMethod()方法,再传到firstMethod()方法,最后传到main()方法,由main()方法传给Kotlin执行环境,这个过程就是Kotlin的异常跟踪栈。

跟踪栈总是最内部的被调用方法逐渐上传,直到最外部的业务操作的起点,通常就是程序的入口main()方法或Thread类的run()方法。

下面示范多线程中发生异常的情形:

class ThreadExceptionTest : Runnable {
    override fun run() {
        firstMethod()
    }

    fun firstMethod() {
        secondMethod()
    }

    fun secondMethod() {
        val c = 5 / 0
    }

}

fun main(args: Array<String>) {
    Thread(ThreadExceptionTest()).start()
}

输出结果:

Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero
	at 0708.ThreadExceptionTest.secondMethod(ThreadExceptionTest.kt:13)
	at 0708.ThreadExceptionTest.firstMethod(ThreadExceptionTest.kt:9)
	at 0708.ThreadExceptionTest.run(ThreadExceptionTest.kt:5)
	at java.base/java.lang.Thread.run(Thread.java:844)

学海无涯苦作舟

我的微信公众号.jpg

基本语法
  • 作者:HunterArley (联系作者)
  • 发表时间:2019-11-28 09:12
  • 版权声明:本网站部分内容转载于合作站点或其他站点,但都会注明作/译者和原出处。如有不妥之处,敬请指出。
  • 公众号转载:请在文末添加作者公众号二维码