Để thêm vào câu trả lời của miensol : mặc dù tính năng đa bắt trong Kotlin chưa được hỗ trợ, nhưng có nhiều lựa chọn thay thế hơn cần được đề cập.
Bên cạnh đó try-catch-when
, bạn cũng có thể triển khai một phương pháp để bắt chước nhiều lần bắt. Đây là một tùy chọn:
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
}
}
Và sử dụng nó sẽ trông giống như:
fun main(args: Array<String>) {
{
println("Hello")
}.catch(IOException::class, IllegalAccessException::class) {
}
}
Bạn sẽ muốn sử dụng một hàm để tạo lambda thay vì sử dụng lambda thô như được hiển thị ở trên (nếu không, bạn sẽ gặp phải "MANY_LAMBDA_EXPRESSION_ARGUMENTS" và các vấn đề khác khá nhanh). Một cái gì đó giống như fun attempt(block: () -> Unit) = block
sẽ hoạt động.
Tất nhiên, bạn có thể muốn chuỗi các đối tượng thay vì lambdas để soạn logic của bạn một cách thanh lịch hơn hoặc để hoạt động khác với một thử nghiệm cũ đơn giản.
Tôi chỉ khuyên bạn nên sử dụng cách tiếp cận này trên miensol nếu bạn đang thêm một số chuyên môn . Đối với việc sử dụng nhiều bắt đơn giản, một when
biểu thức là giải pháp đơn giản nhất.
pdvrieze
bài trả lời ở đây: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)