gpt4 book ai didi

scala - 从 Scala 中的异常返回的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 10:17:50 25 4
gpt4 key购买 nike

在非功能性语言中,我可能会执行以下操作:

try {
// some stuff
} catch Exception ex {
return false;
}

// Do more stuff

return true;

然而,在 Scala 中,这种模式显然是不正确的。如果我的 scala 代码如下所示:
try {
// do some stuff
}
catch {
case e: Exception => // I want to get out of here and return false
)
}

// do more stuff

true

我该如何正确地做到这一点?当然,我不想使用“return”语句,但我也不想放弃并“做更多的事情”并最终返回 true。

最佳答案

您希望表示可以成功或发出错误信号的计算。这是 Try 的完美用例单子(monad)。

import scala.util.{ Try, Success, Failure }

def myMethod: Try[Something] = Try {
// do stuff
// do more stuff
// if any exception occurs here, it gets wrapped into a Failure(e)
}

所以你返回一个 Try而不是 Bool ,这是无限地更加清晰和惯用的。

使用示例:
myMethod match {
case Success(x) => println(s"computation succeded with result $x")
case Failure(e) => println(s"computation failed with exception $e.getMessage")
}

如果您甚至不关心异常,而只想在成功的情况下返回一个值,您甚至可以转换 TryOption .
def myMethod: Option[Something] = Try {
// do stuff
// do more stuff
// return something
// if any exception occurs here, it gets wrapped into a Failure(e)
}.toOption

myMethod match {
case Some(x) => println(s"computation succeded with result $x")
case None => println("computation failed")
}

要回答评论中的问题,您可以这样做
Try {
// do stuff
} match {
case Failure(_) => false
case Success(_) =>
// do more stuff
// true
}

虽然我建议返回比 Boolean 更有意义的东西,只要有意义。

当然这个可以嵌套
Try {
// do stuff
} match {
case Failure(_) => false
case Success(_) =>
// do more stuff
Try {
// something that can throw
} match {
case Failure(_) => false
case Success(_) =>
// do more stuff
true
}
}

但你应该考虑把 Try block 成单独的函数(返回 Try )。

最终,我们可以利用 Try 的事实。是一个单子(monad),做这样的事情
Try { /* java code */ }.flatMap { _ =>
// do more stuff
Try { /* java code */ }.flatMap { _ =>
// do more stuff
Try { /* java code */ }
}
} match {
case Failure(_) => false // in case any of the Try blocks has thrown an Exception
case Success(_) => true // everything went smooth
}

关于scala - 从 Scala 中的异常返回的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25394789/

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