从Scala中的异常返回的正确方法是什么?

克里斯托弗·安伯勒

在非功能性语言中,我可能会执行以下操作:

try {
  // some stuff
} catch Exception ex {
  return false;
}

// Do more stuff

return true;

但是,在Scala中,这种模式显然是不正确的。如果我的scala代码如下所示:

try {
  // do some stuff
}
catch {
  case e: Exception => // I want to get out of here and return false
  )
}

// do more stuff

true

我该怎么做呢?我当然不想使用“ return”语句,但是我也不想删除并“做更多的事情”并最终返回true。

加布里埃·彼得罗内拉

您想要表示一个可以成功执行或表示已发生错误的计算。那是Trymonad的完美用例

import scala.util.{ Try, Success, Failure }

def myMethod: Try[Something] = Try {
  // do stuff
  // do more stuff
  // if any exception occurs here, it gets wrapped into a Failure(e)
}

因此,您将返回aTry而不是a Bool,这将更加清晰明了。

用法示例:

myMethod match {
  case Success(x) => println(s"computation succeded with result $x")
  case Failure(e) => println(s"computation failed with exception $e.getMessage")  
}

如果您甚至不关心异常,但只想在成功的情况下返回值,则可以将转换TryOption

def myMethod: Option[Something] = Try {
  // do stuff
  // do more stuff
  // return something
  // if any exception occurs here, it gets wrapped into a Failure(e)
}.toOption

myMethod match {
  case Some(x) => println(s"computation succeded with result $x")
  case None => println("computation failed")  
}

要回答评论中的问题,您可以

Try {
  // do stuff
} match {
   case Failure(_) => false
   case Success(_) =>
     // do more stuff
     // true
}

尽管我建议在有意义的Boolean时候返回比a更有意义的东西

当然可以嵌套

Try {
  // do stuff
} match {
   case Failure(_) => false
   case Success(_) =>
     // do more stuff
     Try {
       // something that can throw
     } match {
       case Failure(_) => false
       case Success(_) =>
         // do more stuff
         true
     }
}

但是您应该考虑将这些Try块放入单独的函数中(返回Try)。

最终,我们可以利用Try单子这一事实,并执行类似的操作

Try { /* java code */ }.flatMap { _ =>
  // do more stuff
  Try { /* java code */ }.flatMap { _ =>
    // do more stuff
    Try { /* java code */ }
  }
} match {
  case Failure(_) => false // in case any of the Try blocks has thrown an Exception 
  case Success(_) => true // everything went smooth
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Scala中正确扩展Java异常的最佳方法是什么?

来自分类Dev

从角度订阅中返回的正确方法是什么?

来自分类Dev

在 Spring 中返回 List 的正确方法是什么

来自分类Dev

在 C++ 中引发异常和处理某些异常类型的正确方法是什么

来自分类Dev

在Java中,在引发异常的方法中关闭变量的正确方法是什么?

来自分类Dev

在GWT中的异步方法中传递异常的正确方法是什么?

来自分类Dev

捕获在不同线程中运行的方法的异常的正确方法是什么?

来自分类Dev

在Java 8中检查链接语句中的null或检查异常的正确方法是什么?

来自分类Dev

捕获服务结构ReceiveReminderAsync中未处理的所有异常的正确方法是什么

来自分类Dev

在生成 Excel 或 PDF 文件作为响应的 REST API 中处理异常的正确方法是什么?

来自分类Dev

创建异常层次结构的正确方法是什么?

来自分类Dev

嵌套异常的正确方法是什么?-使用Delphi

来自分类Dev

在 Mockito 中,在连续调用非静态方法时返回不同结果的正确方法是什么?

来自分类Dev

在Scala中处理未实例化的类变量的正确方法是什么?

来自分类Dev

在Scala中,修复“错误:前向引用扩展到值的定义”的正确方法是什么?

来自分类Dev

在不使用指针的情况下,在C ++中返回“无效值”类型的正确方法是什么?

来自分类Dev

用参数创建函数并在单行中返回值的正确方法是什么?

来自分类Dev

在Rest Web服务请求中返回文件的正确方法是什么?

来自分类Dev

在Perl中运行此命令的正确方法是什么,没有错误返回

来自分类Dev

循环后,将所有迭代元素返回到列表中的正确方法是什么?

来自分类Dev

在导航控制器堆栈中返回顶部视图控制器的正确方法是什么?

来自分类Dev

正确的方法是什么?

来自分类Dev

从FFI返回的片中创建OsStr(ing)的正确方法是什么?

来自分类Dev

从对象返回嵌套集合的正确方法是什么?

来自分类Dev

ColdFusion从Java返回查询对象的正确方法是什么?

来自分类Dev

从灯具返回结构化数据的正确方法是什么?

来自分类Dev

使用c ++ 11线程返回结果的正确方法是什么?

来自分类Dev

找出sql语句返回true或false的正确方法是什么?

来自分类Dev

从对象返回嵌套集合的正确方法是什么?

Related 相关文章

  1. 1

    在Scala中正确扩展Java异常的最佳方法是什么?

  2. 2

    从角度订阅中返回的正确方法是什么?

  3. 3

    在 Spring 中返回 List 的正确方法是什么

  4. 4

    在 C++ 中引发异常和处理某些异常类型的正确方法是什么

  5. 5

    在Java中,在引发异常的方法中关闭变量的正确方法是什么?

  6. 6

    在GWT中的异步方法中传递异常的正确方法是什么?

  7. 7

    捕获在不同线程中运行的方法的异常的正确方法是什么?

  8. 8

    在Java 8中检查链接语句中的null或检查异常的正确方法是什么?

  9. 9

    捕获服务结构ReceiveReminderAsync中未处理的所有异常的正确方法是什么

  10. 10

    在生成 Excel 或 PDF 文件作为响应的 REST API 中处理异常的正确方法是什么?

  11. 11

    创建异常层次结构的正确方法是什么?

  12. 12

    嵌套异常的正确方法是什么?-使用Delphi

  13. 13

    在 Mockito 中,在连续调用非静态方法时返回不同结果的正确方法是什么?

  14. 14

    在Scala中处理未实例化的类变量的正确方法是什么?

  15. 15

    在Scala中,修复“错误:前向引用扩展到值的定义”的正确方法是什么?

  16. 16

    在不使用指针的情况下,在C ++中返回“无效值”类型的正确方法是什么?

  17. 17

    用参数创建函数并在单行中返回值的正确方法是什么?

  18. 18

    在Rest Web服务请求中返回文件的正确方法是什么?

  19. 19

    在Perl中运行此命令的正确方法是什么,没有错误返回

  20. 20

    循环后,将所有迭代元素返回到列表中的正确方法是什么?

  21. 21

    在导航控制器堆栈中返回顶部视图控制器的正确方法是什么?

  22. 22

    正确的方法是什么?

  23. 23

    从FFI返回的片中创建OsStr(ing)的正确方法是什么?

  24. 24

    从对象返回嵌套集合的正确方法是什么?

  25. 25

    ColdFusion从Java返回查询对象的正确方法是什么?

  26. 26

    从灯具返回结构化数据的正确方法是什么?

  27. 27

    使用c ++ 11线程返回结果的正确方法是什么?

  28. 28

    找出sql语句返回true或false的正确方法是什么?

  29. 29

    从对象返回嵌套集合的正确方法是什么?

热门标签

归档