最好在获取URL时返回None或抛出异常?

Jam*_*mes 13 scala exception idiomatic throw scala-option

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

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

Jea*_*let 32

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

  • 你想强制调用者处理错误吗?如果是这样,请不要抛出异常,因为Scala没有强制调用者捕获它们的检查异常机制.

  • 如果出现错误,您是否要包含失败原因的详细信息?如果没有,你可以返回Option[A],A你的返回类型在哪里,然后你要么Some(validContent)None没有其他解释.如果是的话,你可以返回类似的东西Either[E, A]或Scalaz Validation[E, A].所有这些选项都会强制调用者以某种方式展开结果,同时可以根据需要自由处理错误E.现在该怎么E办?

  • 如果发生故障,您想提供堆栈跟踪吗?如果是这样,你可以返回Either[Exception, A]Validation[Exception, A].如果您真的使用例外,那么您将需要使用Try[A],其中两个可能的情况是Failure(exc: Throwable)Success(value: A).请注意,您当然会产生创建throwable的成本.如果没有,你可能只是回来Either[String, A](并且要特别小心,记住Right这里的成功与失败 - Left通常用于错误,而Right对于"正确"值 - Validation可能更清晰).如果你想选择地返回堆栈跟踪,你可以使用电梯的Box[A],这可能是Full(validContents),Empty有没有更多的解释(非常类似Option[A]了这里),或表明Failure它可以存储一个错误字符串和/或抛出(及以上) .

  • 你是否想提供多种迹象表明它失败的原因?然后回来Either[Seq[String], A].如果你经常这样做,你可能想要使用Scalaz而Validation[NonEmptyList[String], A]不是,它提供了一些其他不错的好东西.查找有关它的更多信息或查看这些用法示例.