面试题答案
一键面试异常处理与资源释放策略
- try - catch 块:在协程内部使用
try - catch
块捕获异常。这样可以在异常发生时及时处理,避免异常向上传递导致未处理异常的情况。 - 使用
finally
块:结合try - catch
,在finally
块中进行资源的释放操作。这样无论协程执行过程中是否发生异常,资源都能得到释放。 CoroutineExceptionHandler
:对于多个协程,可以设置一个全局的CoroutineExceptionHandler
来统一处理未捕获的异常。这在某些情况下可以简化异常处理逻辑。
示例代码
假设我们在协程中使用数据库连接(这里简单示意,实际Android中会使用如 SQLiteOpenHelper
等)和文件句柄。
import kotlinx.coroutines.*
import java.io.File
import java.io.FileWriter
import java.io.IOException
// 模拟数据库连接类
class DatabaseConnection {
fun connect() = println("Connected to database")
fun disconnect() = println("Disconnected from database")
}
// 模拟复杂业务逻辑函数
suspend fun complexBusinessLogic(db: DatabaseConnection, file: File) {
val fileWriter = try {
db.connect()
FileWriter(file)
} catch (e: IOException) {
println("Failed to open file: $e")
db.disconnect()
return
}
try {
// 模拟复杂业务逻辑,这里简单写一些操作
fileWriter.write("Some data")
// 假设这里可能会抛出异常
if (Math.random() < 0.5) {
throw IOException("Simulated I/O error")
}
} catch (e: IOException) {
println("Error in business logic: $e")
} finally {
try {
fileWriter.close()
} catch (e: IOException) {
println("Error closing file: $e")
}
db.disconnect()
}
}
fun main() = runBlocking {
val db = DatabaseConnection()
val file = File("test.txt")
launch {
complexBusinessLogic(db, file)
}.join()
}
关于 CoroutineExceptionHandler
的示例
val exceptionHandler = CoroutineExceptionHandler { _, exception ->
println("Caught exception: $exception")
}
fun main() = runBlocking {
val db = DatabaseConnection()
val file = File("test.txt")
launch(exceptionHandler) {
complexBusinessLogic(db, file)
}.join()
}
在上述代码中,complexBusinessLogic
函数展示了如何在协程中使用 try - catch - finally
来处理异常和释放资源。同时,CoroutineExceptionHandler
的示例展示了如何设置全局的异常处理器来捕获未处理的异常。