gpt4 book ai didi

scala - 获取 URL 时最好返回 None 还是抛出异常?

转载 作者:行者123 更新时间:2023-12-03 23:04:46 25 4
gpt4 key购买 nike

我有一个 Scala 辅助方法,它当前尝试获取一个 URL 并返回一个带有该网页 HTML 的 Option[String]。

如果有任何异常(URL 格式错误、读取超时等)或者有任何问题,它会返回 None。问题是,最好抛出异常以便调用代码可以记录异常,还是在这种情况下最好返回 None ?

最佳答案

创建异常很昂贵,因为必须填充堆栈跟踪。抛出和捕获异常也比正常返回更昂贵。考虑到这一点,您可能会问自己以下问题:

  • 您想强制调用者处理错误吗? 如果是这样,请不要抛出异常,因为 Scala 没有强制调用者捕获它们的检查异常机制。
  • 如果出现错误,您是否希望包含有关失败原因的详细信息? 如果没有,您可以直接返回 Option[A] ,其中 A是你的返回类型,然后你要么有 Some(validContent)None ,没有额外的解释。如果是,您可以返回类似 Either[E, A] 的内容或 Scalaz Validation[E, A] .所有这些选项都迫使调用者以某种方式解开结果,同时可以自由地处理错误 E如他所愿。现在应该怎么办E是?
  • 您想在失败的情况下提供堆栈跟踪吗? 如果是这样,您可以返回 Either[Exception, A]Validation[Exception, A] .如果你真的有异常(exception),你会想要使用 Try[A] ,其两种可能的情况是 Failure(exc: Throwable)Success(value: A) .请注意,您当然会产生创建 throwable 的成本。如果没有,你可以直接返回 Either[String, A] (并且要特别注意 Right 在这里表示成功还是失败 — Left 通常用于错误,而 Right 表示“正确”值 — Validation 可能更清楚)。如果您想选择返回堆栈跟踪,您可以使用 Lift 的 Box[A] ,这可能是 Full(validContents) , Empty没有额外的解释(非常类似于 Option[A] 到这里),或者指出一个 Failure它可以存储错误字符串和/或 throwable(以及更多)。
  • 您可能想提供多种关于失败原因的迹象吗? 然后返回 Either[Seq[String], A] .如果你经常这样做,你可能想使用 Scalaz 和 Validation[NonEmptyList[String], A]相反,它提供了一些其他不错的东西。查找有关它的更多信息或查看 these usage examples .
  • 关于scala - 获取 URL 时最好返回 None 还是抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6891018/

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