Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Kotlin中同时捕获多个异常_Kotlin - Fatal编程技术网

如何在Kotlin中同时捕获多个异常

如何在Kotlin中同时捕获多个异常,kotlin,Kotlin,或 结果,出现编译错误:未解析的引用:MyException2 如何在Kotlin上同时捕获多个异常?更新: 如果希望此功能在Kotlin中使用,请投票支持以下问题。谢谢你,克里斯坦 根据这一点,目前不支持此功能 阿布雷斯拉夫-喷气式飞机队 现在没有,但它在桌子上 不过,您可以模拟多重捕捉: try { } catch (ex: MyException1 | MyException2 ) { logger.warn("", ex) } 加上To的回答:虽然Kotlin中的多捕获还不

结果,出现编译错误:
未解析的引用:MyException2

如何在Kotlin上同时捕获多个异常?

更新: 如果希望此功能在Kotlin中使用,请投票支持以下问题。谢谢你,克里斯坦

根据这一点,目前不支持此功能

阿布雷斯拉夫-喷气式飞机队

现在没有,但它在桌子上

不过,您可以模拟多重捕捉:

try { 

} catch (ex: MyException1 | MyException2 ) {
    logger.warn("", ex)
}
加上To的回答:虽然Kotlin中的多捕获还不受支持,但还有更多的替代方案需要提及

除了在时尝试捕获之外,还可以实现一种方法来模拟多捕获。这里有一个选择:

try {
    // do some work
} catch (ex: Exception) {
    when(ex) {
        is IllegalAccessException, is IndexOutOfBoundsException -> {
            // handle those above
        }
        else -> throw ex
    }
}
fun(()->Unit).catch(vararg异常:KClass,catchBlock:(Throwable)->Unit){
试试{
这()
}捕获(e:可丢弃){
如果(异常中的e::class)catchBlock(e)else抛出e
}
}
使用它看起来像:

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){
// ...
{
println(“Hello”)//一些可能引发异常的代码
}.catch(IOException::class,IllegalAccessException::class){
//处理异常
}
}
您将希望使用函数来生成lambda,而不是像上面所示使用原始lambda(否则您将很快遇到“许多lambda表达式参数”和其他问题)。类似于
有趣的尝试(block:()->Unit)=block
的方法可以工作

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

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

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

你的回答启发我写了一个扩展函数。要允许继承类,您必须检查
实例
,而不是直接比较

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

    }.catch(IOException::class, IllegalAccessException::class) {
        // Handle the exception
    }
}
inlinefunmulticatch(runThis:()->Unit,catchBlock:(Throwable)->Unit,vararg异常:KClass){
试一试{
runThis()
}捕获(异常:异常){
val contains=exceptions.find{
it.isInstance(例外)
}
if(包含!=null)catchBlock(异常)
否则抛出异常
}}

要了解如何使用,您可以查看GitHub上的my library,在Kotlin中,您可以执行以下操作:

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
}}

我正在复制
pdvrieze
reply here:
这当然有效,但效率稍低,因为捕获的异常对jvm是显式的(因此不会捕获并重新捕获未处理的异常,这将是解决方案的必然结果)
@IARI
else
子句重新引用了不需要的异常。@IARI即使你抛开优雅和丑陋的论据,Kotlin(声称简洁)实际上是Java的2倍,在这种情况下,它会被Detekt标记,因为你捕捉到了太一般的异常;-)如果我理解正确的话,你可以在catch中传递类,但是param
异常
接受对象。你真是个了不起的人@aro,谢谢你提供这个替代方案。这个替代方案很好,谢谢aro:)总比什么都没有好。尽管我的KT-7128是5年前发行的,但我希望他们能看到这一点:-)你能改变一下你的例子吗?我不知道如何调用这个函数。我正在尝试
fun test(){myExceptionCode}.catch()
,但它没有work@Andrew我很快会考虑换的。有一点让我担心的是,人们正试图生吃它。这是一个概念证明,为人们提供了编写自己的帮助函数的起点。它肯定需要清理--主要是删除lambda扩展,因为这可能是一个混乱的问题,-1”的原因是什么?在Java中尝试{…}catch(X | ye){…}也会检查继承。这个答案模仿了Java的行为,例如捕捉具有许多不同子类型的IOException更方便。
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
}}
try{
} catch(e: MyException1){
} catch(e: MyException2){
} catch(e: MyException3){
} [...]