You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:15:05