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]
不是,它提供了一些其他不错的好东西.查找有关它的更多信息或查看这些用法示例.