gpt4 book ai didi

scala - 在Scala中正确使用Either、Try和Exceptions/ControlThrowable

转载 作者:行者123 更新时间:2023-12-03 07:37:59 36 4
gpt4 key购买 nike

在我的 Scala 代码(库和应用程序)中,我目前混合使用 OptionTry ,无论何时都感觉更合适。

我倾向于实现“doSomething”方法,该方法可以成功返回值或失败 Try .也就是说,它们可以包含抛出的代码,或者,当我“手动”检测到错误时,我人为地创建了一个 Throwable并返回 Failure .因此,这些方法的返回值是 Try[ReturnType] .

现在我读到创建异常有点不理想,因为它创建了一个堆栈跟踪(因此很慢),我什至不需要它。我还看到了使用 ControlThrowable 子类的示例。 ,它不会创建堆栈跟踪,但是它们也没有消息,以及 Try当然抓不到。

现在我的具体问题是,我是否应该普遍赞成 EitherTry当我想做运行时错误处理/方法返回值时,使用 Try仅在我确实需要捕获某些内容的情况下(例如第三方代码)?
这样我就不必创建笨拙的 Throwable s,但只使用例如Left 中的字符串对于错误。

所以基本上:

  • Option : 日常使用的东西是否有值(value)
  • Try : 在方法中捕获异常,但不用作返回值
  • Either :通用返回值,包含错误(字符串)或成功值

  • 这个概念会很好用,还是有更可行/更通用的方法?

    最佳答案

    Travis Brown在评论中指出,没有真正的公约,这在很大程度上是一种文化。为了保持代码的可读性,一致性是这里最重要的事情。我见过以下代码库:

  • 使用选项表示“None 成功,任何 Some(...) 包含错误信息”
  • 使用 Try 以返回包含空字符串的成功或包含错误消息
  • 的失败。
  • 使用错误的方式(即 Either[?, Throwable] )

  • 显然,这些都不是好的做法,但只要您保持一致,这并不重要。我个人在娱乐和工作中使用的约定是:
  • Option 当值丢失时有效(例如,当使用 playframework 解析 JSON 时)。
  • Try 当尝试做一些可能会失败的事情时(除非它在 ​​Future 中,在这种情况下我只使用 .recover ),在那里我关心匹配异常的类型,但也希望成功的结果可用。
  • Either 当我不想在我的“失败”情况下返回异常/抛出时(虽然说实话这很少见)。

  • 无论我使用上述哪一种,我个人认为最好尽可能长时间地将其包裹起来。这会阻止不必要的 Throwables 在你的代码中被抛出(哈哈),并且由于没有任何隐藏的 getOrElse 使得调试更容易。返回默认值的行(这在大型代码库中会变得非常烦人)。

    关于scala - 在Scala中正确使用Either、Try和Exceptions/ControlThrowable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54665123/

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