如何在Kotlin同时捕获许多例外

时间:2016-04-21 05:34:52

标签: kotlin

try { 

} catch (ex: MyException1, MyException2 ) {
    logger.warn("", ex)
}

try { 

} catch (ex: MyException1 | MyException2 ) {
    logger.warn("", ex)
}

因此,编译错误:Unresolved reference: MyException2

如何在Kotlin上同时捕获许多例外?

4 个答案:

答案 0 :(得分:53)

更新: 如果您希望此功能登陆Kotlin,请投票支持以下问题KT-7128谢谢@Cristan

根据此thread,目前不支持此功能。

  

abreslav - JetBrains团队

     

目前不是,但它在桌面上

你可以模仿多重捕捉:

try {
    // do some work
} catch (ex: Exception) {
    when(ex) {
        is IllegalAccessException, is IndexOutOfBoundsException -> {
            // handle those above
        }
        else -> throw ex
    }
}

答案 1 :(得分:3)

要添加到miensol的答案:虽然Kotlin中的多次捕获尚未得到支持,但还有更多选择应该被提及。

try-catch-when之外,您还可以实现一种模仿多捕获的方法。这是一个选项:

fun (() -> Unit).catch(vararg exceptions: KClass<out Throwable>, catchBlock: (Throwable) -> Unit) {
    try { 
        this() 
    } catch (e: Throwable) {
        if (e::class in exceptions) catchBlock(e) else throw e
    }
}

使用它看起来像:

fun main(args: Array<String>) {
    // ...
    {
        println("Hello") // some code that could throw an exception

    }.catch(IOException::class, IllegalAccessException::class) {
        // Handle the exception
    }
}

你想要使用一个函数来生成一个lambda,而不是使用如上所示的原始lambda(否则你会很快遇到&#34; MANY_LAMBDA_EXPRESSION_ARGUMENTS&#34;以及其他问题)。像fun attempt(block: () -> Unit) = block这样的东西可行。

当然,您可能希望链接对象而不是lambdas,以便更优雅地组合逻辑,或者使用与普通旧的try-catch不同的行为。

如果您要添加一些专业化,我建议您使用此方法优于miensol。对于简单的多捕获用法,when表达式是最简单的解决方案。

答案 2 :(得分:0)

aro中的示例非常好,但是如果存在继承,它将无法像Java中那样工作。

您的回答启发了我为此编写扩展功能。为了也允许继承的类,您必须检查instance而不是直接进行比较。

inline fun multiCatch(runThis: () -> Unit, catchBlock: (Throwable) -> Unit, vararg exceptions: KClass<out Throwable>) {
try {
    runThis()
} catch (exception: Exception) {
    val contains = exceptions.find {
        it.isInstance(exception)
    }
    if (contains != null) catchBlock(exception)
    else throw exception
}}

要查看使用方法,可以在GitHub here上的我的库中查看

答案 3 :(得分:0)

在 Kotlin 中,您可以这样做:

try{
} catch(e: MyException1){
} catch(e: MyException2){
} catch(e: MyException3){
} [...]