如何处理 kotlin arrow 中的逻辑错误

问题描述 投票:0回答:1

我正在开发一个功能,其中有多个可能的故障路径需要区分。我的路是

  1. 成功-返回值
  2. 逻辑错误 - 可以恢复的非致命问题
  3. 异常 - 应该冒泡的意外错误

我在这里找到了箭头文档:https://arrow-kt.io/learn/typed-errors/working-with-typed-errors/并通读它,但我仍然在努力理解如何实际操作应用信息。

如果我有如下代码:

fun doValidation():Either<Error,String>
{
    val v1 = "123abc"
    val v2 = "abc"
    val v3 = "1234"
    validateName(v1)
    validateName(v2)
    validateName(v3)
}

fun validateName( value:String):Either<Error,String>
{
    if(value.length < 4)
    {
        //this is an unexpected exception
        return Error("$value has less than 4 characters").left()
    }
    else if(value.contains("abc"))
    {
        //this is a logical failure that we can recover from
        //this will not compile as-written
       return value.left()
    }
    else
    {
        return (value + "_xyz").right()
    }
}

实现 validateName() 的惯用方法是什么,以便 doValidation 可以检测逻辑错误并从逻辑错误中恢复,同时仍然在调用堆栈中冒泡异常?

kotlin error-handling arrow-kt
1个回答
0
投票

意外的错误应该作为异常抛出,以便它们可以在调用堆栈中冒泡。预期错误(又名逻辑错误)作为 Either

left
部分返回:

fun validateName(value: String): Either<Error, String> = when {
    value.length < 4 -> throw IllegalArgumentException("$value has less than 4 characters")
    value.contains("abc") -> Error("$value contains abc").left()
    else -> (value + "_xyz").right()
}
© www.soinside.com 2019 - 2024. All rights reserved.