Как уже упоминалось в комментариях: от именования я бы ожидал, что suppressExceptions скорее принимает параметр исключений, которые должны быть подавлены.
Интересно, хотите ли вы на самом деле проверить, является ли выброшенное исключение на самом деле экземпляром данных типов исключений, т. Е. Должны ли быть утверждены / исключены также подклассы указанных типов.
В таком случае я бы предпочел использовать следующий код:
inline fun <T> suppressAllExceptions(vararg exceptExceptions: Class<out Exception> = emptyArray(),
block: () -> T) = try {
block()
} catch (e: Exception) {
throw if (exceptExceptions.any { it.isInstance(e) }) {
e
} else SuppressedException(e)
}
Вы бы все равно использовали его так же, как показали:
suppressAllExceptions {
throw IllegalStateException("i am suppressed soon")
}
suppressAllExceptions(IllegalStateException::class.java,
IllegalArgumentException::class.java) {
throw IllegalStateException("i am not suppressed")
}
class MyIllegalStateException : IllegalStateException()
suppressAllExceptions(IllegalStateException::class.java,
IllegalArgumentException::class.java) {
throw MyIllegalStateException("i am not suppressed neither")
}
Чем больше я об этом думаю: почему вы одобряете разные типы исключений в разных местах? Это не звучит правильно для меня. Скорее всего, вы хотите подавить все исключения, кроме некоторых четко определенных, и в таком случае вам не нужна такая универсальная функция, а есть одна функция подавления, которая содержит этот четко определенный список:
/**
* Suppresses all exceptions except the well-defined ones: [NotFoundException], ...
*/
inline fun <T> suppressExceptions(block: () -> T) = try {
block()
} catch (e: Exception) {
throw when (e) {
is NotFoundException,
is ForbiddenException,
// all the other well-defined non-suppressable types
is AuthorizationException -> e
else -> SuppressedException(e)
}
}