try {
} catch (ex: MyException1, MyException2 ) {
logger.warn("", ex)
}
要么
try {
} catch (ex: MyException1 | MyException2 ) {
logger.warn("", ex)
}
结果,出现编译错误:Unresolved reference: MyException2
。
如何在Kotlin上同时捕获许多例外?
Answers:
else
子句会抛出不需要的异常。
要补充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(否则,您很快就会遇到“ MANY_LAMBDA_EXPRESSION_ARGUMENTS”和其他问题)。这样的东西fun attempt(block: () -> Unit) = block
会起作用。
当然,您可能希望链接对象而不是lambda,以便更优雅地构成逻辑或表现得比普通的try-catch不同。
如果要添加一些专业化,我只建议在miensol上使用这种方法。对于简单的多捕获用途,when
表达式是最简单的解决方案。
exceptions
会接收对象。
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上的我的库中查看
pdvrieze
此处复制回复:This certainly works, but is slightly less efficient as the caught exception is explicit to the jvm (so a non-processed exception will not be caught and rethrown which would be the corollary of your solution)