如何在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是显式的(因此不会捕获并重新捕获未处理的异常,这将是解决方案的必然结果)
@IARIelse
子句重新引用了不需要的异常。@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){
} [...]