Scala 在获取URL时最好返回None或抛出异常?
我有一个Scala助手方法,它当前试图获取URL并返回带有该网页HTML的选项[String]Scala 在获取URL时最好返回None或抛出异常?,scala,exception,throw,idioms,scala-option,Scala,Exception,Throw,Idioms,Scala Option,我有一个Scala助手方法,它当前试图获取URL并返回带有该网页HTML的选项[String] 如果存在任何异常(url格式错误、读取超时等),或者存在任何问题,则返回None。问题是,抛出异常以便调用代码可以记录异常是更好,还是在这种情况下返回None更好 创建异常非常昂贵,因为必须填充堆栈跟踪。抛出和捕获异常也比正常返回更昂贵。考虑到这一点,您可能会问自己以下问题: 是否要强制调用方处理错误?如果是,请不要抛出异常,因为Scala没有强制调用方捕获错误的选中异常机制 如果出现错误,是否要包
如果存在任何异常(url格式错误、读取超时等),或者存在任何问题,则返回None。问题是,抛出异常以便调用代码可以记录异常是更好,还是在这种情况下返回None更好 创建异常非常昂贵,因为必须填充堆栈跟踪。抛出和捕获异常也比正常返回更昂贵。考虑到这一点,您可能会问自己以下问题:
- 是否要强制调用方处理错误?如果是,请不要抛出异常,因为Scala没有强制调用方捕获错误的选中异常机制
- 如果出现错误,是否要包括失败原因的详细信息?如果没有,您可以返回
,其中选项[A]
是您的返回类型,然后您可以选择A
或部分(有效内容)
,无需额外解释。如果是,您可以返回类似于无
或Scalaz的内容[E,A]
。所有这些选项都强制调用方以某种方式打开结果,同时可以自由地处理错误验证[E,A]
。现在E
应该是什么E
- 是否要在出现故障时提供堆栈跟踪?如果是,可以返回
或
。如果您真的选择了异常,您将需要使用验证[Exception,a]
,其两种可能的情况是Try[A]
和失败(exc:Throwable)
。请注意,您当然要承担创建可丢弃文件的成本。如果没有,您可以只返回成功(value:A)
(并且要特别小心记住或[String,A]
在这里是指成功还是失败-Right
通常用于错误,而Left
用于“Right”值-Right
验证可能更清楚)。如果您想选择性地返回堆栈跟踪,可以使用Lift的
,它可以是框[a]
,满的(有效内容)
,无需额外解释(非常类似于空的
,直到这里),或者指示一个选项[a]
,它可以存储错误字符串和/或可丢弃的(以及更多)失败
- 您是否希望提供有关失败原因的多个指示?然后返回
。如果您经常这样做,您可能希望使用Scalaz和一个或[Seq[String],A]
,它提供了一些其他好东西。查找更多关于它的信息或查看验证[NonEmptyList[String],一个]
你可以做的一件事是像Lift的
Box
系统。一个盒子本质上是一个选项,但添加了一些功能:一个满的就像一个一些,一个空的就像一个无的,但是电梯更进一步,有一个故障,这就像一个空的,但是有一个原因/消息。一般的经验法则是“如果您可以处理异常,请处理它“。所以没有足够的上下文来猜测。您可以使用tryFetchUrl/fetchUrl方法对。如果它是帮助器方法,我假设它是私有的。如果是私人电话,那么您就是来电者。如果你是打电话的人,那么你就掌握了应该发生什么的所有信息,所以你想做什么就做什么。否则请看Jean的答案。很棒的总结!就我个人而言,我大多数时候使用[String,…]或[String],Scalaz的验证似乎更清晰。