1

ArrowKt 已弃用Try,因为它促进了效果的急切执行,并且建议使用挂起构造函数。但是我应该如何处理以下情况,即我确实希望在不使用传统try-catch 的情况下故意执行。

 fun getMainAccount(accounts: List<String>): Either<Exception, String> {  
   return Try {
     accounts.single()
   }.toEither().mapLeft {
     InvalidAccountError()
   }
 }
4

2 回答 2

5

在 Kotlin 中不需要任何特殊的构造try/catch,因为它也已经是一个表达式。出于这个原因,它已从 Arrow 中删除,您可以简单地编写:

fun getMainAccount(accounts: List<String>): Either<Exception, String> =  
   try {
     Right(accounts.single())
   } catch(e: Exception) {
     Left(InvalidAccountError())
   }

或者您也可以自己轻松地为它编写一个实用函数。

fun <A> Try(f: () -> A, fe: ): Either<Exception, A> = 
   try {
     Right(f())
   } catch(e: Exception) {
      Left(e)
   }

fun getMainAccount(accounts: List<String>): Either<Exception, String> =
   Try { accounts.single() }.mapLeft { InvalidAccountError() }
于 2020-01-20T14:20:56.057 回答
3

现在有一种更简单的方法

fun getMainAccount(accounts: List<String>): Either<Exception, String> = 
    Either.catch {accounts.single()}

于 2021-05-26T18:03:37.233 回答