Вы можете избежать попытки перехвата, используя Kotlin встроенный Результат класс и код. (За кулисами у вас есть попытка поймать - см. источник ).
fun createFormattedText(status: String, description: String): ResultHandler<PricingModel> {
runCatching {
val product = description.format(status)
val listProducts = listOf(1, 2, 3)
ResultHandler.Success(PricingModel(product, listProducts))
}.getOrElse {
ResultHandler.Failure(it)
}
}
Топи c главы в книге «Предпочитать ноль или результат неудачи, когда возможно отсутствие результата », поэтому, если вас не волнует исключение, вы можете сделать это:
fun createFormattedText(status: String, description: String): PricingModel? {
runCatching {
val product = description.format(status)
val listProducts = listOf(1, 2, 3)
PricingModel(product, listProducts)
}.getOrNull()
}
Для отладки / ведения журнала это также будет работать:
fun createFormattedText(status: String, description: String): PricingModel? {
runCatching {
val product = description.format(status)
val listProducts = listOf(1, 2, 3)
PricingModel(product, listProducts)
}.onFailure {
log("Something wrong with $it")
}.getOrNull()
}
К сожалению, вы не можете заменить свой ResultHandler
на Kotlins Result
- потому что Result
не может использоваться в качестве возвращаемого типа. Я нашел этот пост , объясняющий причины, а также обходной путь, надеюсь, это поможет.
В качестве альтернативы вы можете создать собственную функцию расширения для вашего ResultHandler
и перенести обработку исключений под капот:
public inline fun <R> runCatching(block: () -> R): ResultHandler<R> {
return try {
ResultHandler.Success(block())
} catch (e: Throwable) {
ResultHandler.Failure(e)
}
}