我正在开发一个功能,其中有多个可能的故障路径需要区分。我的路是
我在这里找到了箭头文档: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 可以检测逻辑错误并从逻辑错误中恢复,同时仍然在调用堆栈中冒泡异常?
意外的错误应该作为异常抛出,以便它们可以在调用堆栈中冒泡。预期错误(又名逻辑错误)作为 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()
}