【问题标题】:How to nicely transform a Try[Unit] to a Unit while handling certain exceptions?如何在处理某些异常时很好地将 Try[Unit] 转换为 Unit?
【发布时间】:2016-05-19 20:30:36
【问题描述】:

我有这样的事情:

def mySideEffectingMethod(): Unit = {
  Try(someSideEffectingJavaMethod()) match {
    case Failure(_: SomeExpectedException) => someSideEffectingJavaMethod() //perhaps attempt it again, for example
    case Failure(ex) => throw ex
    case Success(_) => //unit
  }
}

有没有办法让我失去丑陋的case Success(_) => //unit?我不认为 recoverrecoverWith 会削减它,因为在这种情况下它们将返回 Try[Unit] 而不是 Unit 从而抑制非预期异常。

【问题讨论】:

  • 对不起,但在这种情况下,我认为您需要 try 语句而不是 Try monad。如果您想以函数方式累积错误并将其他一些函数应用于属于 Success[T] 的对象,则使用 Try
  • 是的,这很公平。我想上面的丑陋也可以。
  • 如果您真的不在乎 Success 尝试所带来的价值,为什么不只是默认? case _ =>

标签: scala scala-2.11


【解决方案1】:

当您想以 函数式 方式处理异常和错误时,您可以使用 Try[T] monad。特别是,使用Try[T] monad 可以让您累积异常并继续详细说明属于Success[T] 的结果,Success[T]Try[T] 的子类。

在您的情况下,您似乎只需要处理异常行为。在这种情况下,您可以简单地使用try 语句。

def mySideEffectingMethod = {
   try {
     someSideEffectingJavaMethod 
   } catch {
     case _: SomeExpectedException => someSideEffectingJavaMethod()    
     //perhaps attempt it again, for example
     case ex => throw ex
   }
}

在您的情况下,您可以使用try 语句,因为您正在对输入进行一些副作用。但是,如果你采用更功能的方法,这意味着完全没有副作用,你必须修改Try monad。

我认为解释如何在 Scala 中以函数方式处理异常的最佳指南之一是 The Neophyte's Guide to Scala Part 6: Error Handling With Try

【讨论】:

    【解决方案2】:

    使用Try 类型的替代方法:

    def mySideEffectingMethod(): Unit = {
      Try(someSideEffectingJavaMethod()).failed.foreach {
        case _: SomeExpectedException => 
          //perhaps attempt it again, for example
          someSideEffectingJavaMethod() 
        case ex => throw ex
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-23
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      相关资源
      最近更新 更多