Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在获取URL时最好返回None或抛出异常?_Scala_Exception_Throw_Idioms_Scala Option - Fatal编程技术网

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

Scala 在获取URL时最好返回None或抛出异常?,scala,exception,throw,idioms,scala-option,Scala,Exception,Throw,Idioms,Scala Option,我有一个Scala助手方法,它当前试图获取URL并返回带有该网页HTML的选项[String] 如果存在任何异常(url格式错误、读取超时等),或者存在任何问题,则返回None。问题是,抛出异常以便调用代码可以记录异常是更好,还是在这种情况下返回None更好 创建异常非常昂贵,因为必须填充堆栈跟踪。抛出和捕获异常也比正常返回更昂贵。考虑到这一点,您可能会问自己以下问题: 是否要强制调用方处理错误?如果是,请不要抛出异常,因为Scala没有强制调用方捕获错误的选中异常机制 如果出现错误,是否要包

我有一个Scala助手方法,它当前试图获取URL并返回带有该网页HTML的选项[String]


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

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

  • 是否要强制调用方处理错误?如果是,请不要抛出异常,因为Scala没有强制调用方捕获错误的选中异常机制

  • 如果出现错误,是否要包括失败原因的详细信息?如果没有,您可以返回
    选项[A]
    ,其中
    A
    是您的返回类型,然后您可以选择
    部分(有效内容)
    ,无需额外解释。如果是,您可以返回类似于
    的内容[E,A]
    或Scalaz
    验证[E,A]
    。所有这些选项都强制调用方以某种方式打开结果,同时可以自由地处理错误
    E
    。现在
    E
    应该是什么

  • 是否要在出现故障时提供堆栈跟踪?如果是,可以返回
    验证[Exception,a]
    。如果您真的选择了异常,您将需要使用
    Try[A]
    ,其两种可能的情况是
    失败(exc:Throwable)
    成功(value:A)
    。请注意,您当然要承担创建可丢弃文件的成本。如果没有,您可以只返回
    或[String,A]
    (并且要特别小心记住
    Right
    在这里是指成功还是失败-
    Left
    通常用于错误,而
    Right
    用于“Right”值-
    验证可能更清楚)。如果您想选择性地返回堆栈跟踪,可以使用Lift的
    框[a]
    ,它可以是
    满的(有效内容)
    空的
    ,无需额外解释(非常类似于
    选项[a]
    ,直到这里),或者指示一个
    失败
    ,它可以存储错误字符串和/或可丢弃的(以及更多)

  • 您是否希望提供有关失败原因的多个指示?然后返回
    或[Seq[String],A]
    。如果您经常这样做,您可能希望使用Scalaz和一个
    验证[NonEmptyList[String],一个]
    ,它提供了一些其他好东西。查找更多关于它的信息或查看


我认为在这种情况下,如果记录异常很重要,那么一定要抛出异常(可能只是返回字符串而不是选项)。否则,您最好返回None。一个警告——可能会有其他您无法预见的例外情况,在这种情况下,编写一个一概而论的代码可能是危险的


你可以做的一件事是像Lift的
Box
系统。一个盒子本质上是一个选项,但添加了一些功能:一个
满的
就像一个
一些
,一个
空的
就像一个
无的
,但是电梯更进一步,有一个
故障
,这就像一个
空的
,但是有一个原因/消息。

一般的经验法则是“如果您可以处理异常,请处理它“。所以没有足够的上下文来猜测。您可以使用tryFetchUrl/fetchUrl方法对。

如果它是帮助器方法,我假设它是私有的。如果是私人电话,那么您就是来电者。如果你是打电话的人,那么你就掌握了应该发生什么的所有信息,所以你想做什么就做什么。否则请看Jean的答案。很棒的总结!就我个人而言,我大多数时候使用[String,…]或[String],Scalaz的验证似乎更清晰。