gpt4 book ai didi

kotlin - 在不使用 try-catch block 的情况下使用有效的 Kotlin 方式处理错误

转载 作者:行者123 更新时间:2023-12-02 11:59:26 25 4
gpt4 key购买 nike

Kotlin 1.3.61

我一直在阅读Effective Kotlin by Marcin Moskala书。并发现处理错误的项目很有趣,因为它不鼓励使用 try-catch block ,而是使用自定义处理程序类

书中引用:

Using such error handling is not only more efficient than the try-catch block but often also easier to use and more explicit



但是,在某些情况下,try-catch 是无法避免的。我有以下片段
class Branding {

fun createFormattedText(status: String, description: String): ResultHandler<PricingModel> {
return try {
val product = description.format(status)
val listProducts = listOf(1, 2, 3)

ResultHandler.Success(PricingModel(product, listProducts))
}
catch (exception: IllegalFormatException) {
ResultHandler.Failure(Throwable(exception))
}
}
}

class PricingModel(val name: String, products: List<Int>)

所以 description.format(status)如果格式化失败会抛出异常

这是我的 HandlerResult 类,以及本书推荐的内容:
sealed class ResultHandler<out T> {
class Success<out T>(val result: T) : ResultHandler<T>()
class Failure(val throwable: Throwable) : ResultHandler<Nothing>()
}

class FormatParsingException: Exception()

以及我如何在代码中使用它们:
fun main() {
val branding = Branding()
val brand = branding.createFormattedText("status", "$%/4ed")

when(brand) {
is Success -> println(brand.result.name)
is Failure -> println(brand.throwable.message)
}
}

我的问题是。这是 try-catch 的情况之一吗?无法避免。或者,如果在不使用 try-catch 时格式失败,我仍然可以返回失败吗? ?

最佳答案

您可以通过使用 Kotlin 内置 Result 来避免 try-catch类和代码。 (在幕后,你有一个try-catch - 见source)。

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)
}
}

书中章节的主题是“Prefer null or Failure result when the lack of result is possible”,所以如果你不关心异常,你可以这样做:
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使用 Kotlin Result - 因为 Result不能用作返回类型。我找到了 post解释推理和解决方法,希望对您有所帮助。

或者,您可以为您的 ResultHandler 构建自己的扩展功能。并将异常处理移到后台:
public inline fun <R> runCatching(block: () -> R): ResultHandler<R> {
return try {
ResultHandler.Success(block())
} catch (e: Throwable) {
ResultHandler.Failure(e)
}
}

关于kotlin - 在不使用 try-catch block 的情况下使用有效的 Kotlin 方式处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60511904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com