Kotlin中如何抛出参数化异常并重构现有带try-catch的通用执行函数
重构方案
核心思路是抽象通用的执行逻辑,将待捕获的异常类型、捕获后异常的转换规则都做成可配置参数,原有两个函数可以作为通用逻辑的特化实现,无需重复编写try-catch模板代码。
第一步:实现通用异常转换执行函数
import kotlin.reflect.KClass /** * 带异常转换的执行函数 * @param catchExceptionType 要捕获的目标异常类型 * @param exceptionTransformer 捕获到异常后,转换为目标抛出异常的逻辑 * @param block 要执行的业务代码块 */ fun <R : Any, T : Exception> executeWithExceptionTransform( catchExceptionType: KClass<T>, exceptionTransformer: (T) -> Exception, block: () -> R ): R { try { return block() } catch (ex: Exception) { // 仅处理指定类型的异常,其余异常原样抛出 if (catchExceptionType.isInstance(ex)) { throw exceptionTransformer(catchExceptionType.java.cast(ex)) } throw ex } }
第二步:基于通用函数实现原有两个特化函数
无需重复写try-catch逻辑,直接复用通用能力:
// 原Rest调用执行函数 fun <R : Any> executeRestCall( block: () -> R ): R = executeWithExceptionTransform( catchExceptionType = RestClientException::class, exceptionTransformer = { IllegalArgumentException(it.message) }, block = block ) // 原流程调用执行函数 fun <R : Any> executeProcessCall( block: () -> R ): R = executeWithExceptionTransform( catchExceptionType = RuntimeException::class, exceptionTransformer = { IllegalStateException(it.message) }, block = block )
自定义异常参数的使用示例
如果需要自定义抛出的异常类型,直接调用通用函数传入自定义参数即可:
// 示例:捕获IOException,抛出自定义的业务异常 val result = executeWithExceptionTransform( catchExceptionType = IOException::class, exceptionTransformer = { BizException("请求资源失败: ${it.message}", it) } ) { // 业务执行逻辑 }
扩展:支持同时捕获多种异常类型
如果需要一次性捕获多个类型的异常,可将通用函数的捕获类型参数改为可变参数:
fun <R : Any> executeWithExceptionTransform( vararg catchExceptionTypes: KClass<out Exception>, exceptionTransformer: (Exception) -> Exception, block: () -> R ): R { try { return block() } catch (ex: Exception) { if (catchExceptionTypes.any { it.isInstance(ex) }) { throw exceptionTransformer(ex) } throw ex } }
内容的提问来源于stack exchange,提问作者darth jemico
相关产品推荐
相关产品推荐

