try {
} catch (ex: MyException1, MyException2 ) {
logger.warn("", ex)
}
或
try {
} catch (ex: MyException1 | MyException2 ) {
logger.warn("", ex)
}
因此,编译错误:Unresolved reference: MyException2
。
如何在Kotlin上同时捕获许多例外?
答案 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){
} [...]