异常发生时,如果没有一个异常处理器来处理这个异常,程序会被中止。在 JVM 当中有一个预先定义好的异常处理层次结构。
结构中的第一层是 catch 块。
try {
crashyCode()
} catch (e: IllegalStateException) {
// 处理 IllegalStateException
} catch (e: HTTPException) {
// 处理 HTTPException
}
如果第一个 catch 块无法处理这个异常,异常便会被传递给下面的 catch 块。如果所有的 catch 块都无法处理某个异常,该异常便会交由当前线程的 UncaughtExceptionHandler
来处理。UncaughtExceptionHandler
是个只有一个方法的接口。
val currentThread = Thread.currentThread()
currentThread.setUncaughtExceptionHandler { thread, exc ->
// 处理当前线程中所有未捕获的异常
}
UncaughtExceptionHandler
可以调协在当前线程里,未被 catch 块捕获的异常处理流程会先来到这里;还可以设置在 ThreadGroup
当中,当前线程的 UncaughtExceptionHandler
无法处理的异常会在这里被处理。如果 ThreadGroup
的 UncaughtExceptionHandler
还是无法处理该异常,那么最终将会被交由默认异常处理程序 ( default uncaught exception handler ) 处理,也就是打印出异常栈,并终止程序。当然你也可以覆盖这种行为:
Thread.setDefaultUncaughtExceptionHandler { thread, exc ->
// 处理所有未捕获的异常
}
网友评论