miensolの回答に追加するには、Kotlinでのマルチキャッチはまだサポートされていませんが、言及する必要のある代替案が他にもあります。
とは別にtry-catch-when
、マルチキャッチを模倣するメソッドを実装することもできます。1つのオプションがあります:
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")
}.catch(IOException::class, IllegalAccessException::class) {
}
}
上記のように生のラムダを使用するのではなく、関数を使用してラムダを生成することをお勧めします(そうしないと、「MANY_LAMBDA_EXPRESSION_ARGUMENTS」やその他の問題がすぐに発生します)。のようなものfun attempt(block: () -> Unit) = block
が機能します。
もちろん、ロジックをよりエレガントに構成したり、従来のtry-catchとは異なる動作をしたりするために、ラムダの代わりにオブジェクトをチェーンしたい場合があります。
専門分野を追加する場合にのみ、miensolよりもこのアプローチを使用することをお勧めします。単純なマルチキャッチの使用の場合、when
式が最も単純なソリューションです。
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)