【问题标题】:scala.util.Try: How to get Throwable value? Pattern matching?scala.util.Try:如何获得 Throwable 值?模式匹配?
【发布时间】:2014-08-31 02:12:01
【问题描述】:

以下 REPL sn-ps 假定:

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

为什么这两条语句编译不通过?我得到“无法将构造函数实例化为预期类型”:

Failure(new Exception("a")) match {
  case Success(i) => "a"; case Failure(e) => "b"; case _ => "c"; }

Success(123) match {
  case Success(i) => "a"; case Failure(e) => "b"; case _ => "c"; }

我可以通过gettoOptionTry 中获得成功值。是否有相应的方法来获取失败的Throwable 值或Option[Throwable]

编辑:从失败/成功转换到尝试工作

Failure(new Exception("a")).asInstanceOf[Try[Int]] match {
  case Success(i) => "a"; case Failure(e) => "b"; case _ => "c"; }

Success(123).asInstanceOf[Try[Int]] match {
  case Success(i) => "a"; case Failure(e) => "b"; case _ => "c"; }

【问题讨论】:

    标签: scala try-catch


    【解决方案1】:

    考虑一下:

    Try(1) match {
        case Success(i) => i
        case Failure(t) => 0 // t is the `Throwable`
    }
    

    这是因为SuccessFailure 是抽象类Try 的子类。但是,以下代码无法编译,因为您不再匹配通用 Try,而是匹配 Failure,它永远可能是 Success 的实例。

    Failure(new Exception("a")) match {
        case Success(i) => "a" // You can see it compiles if you remove this line.
        case Failure(e) => "b"
        case _ => "c"
    }
    

    这就像试图将IntegerString 匹配,这没有任何意义。

    如果你想通过模式匹配获得Throwable,请参见代码的第一个sn-p。

    另一种提取Throwable 的方法是在Try 上使用failed 方法,该方法将从Success 中的故障包装Throwable

    scala> val t: Throwable = Try(throw new Exception).failed.get
    t: Throwable = java.lang.Exception
    

    但是,在 Success 上调用它会引发另一个异常。

    【讨论】:

      【解决方案2】:

      第一个 sn-p 无法编译,因为 Success 不是 Failure 的子类型。编译器认为你很傻,因为 Success(i) 的情况永远不会匹配。

      举一个更简单的例子,这也不能编译。

      Failure(new Exception()) match { case Success(_) => }
      

      出于同样的原因,也不这样做。

      42 match { case Success(_) => }
      

      您所写的内容几乎可以正常工作,但是您要匹配的值必须具有更通用的 Try[_] 类型(如果模式匹配实际用于某些有用的上下文中,它无论如何都会有) .

      (Failure(new Exception("a")): Try[_]) match {
          case Success(i) => "a"; case Failure(e) => "b"; case _ => "c"; }
      

      【讨论】:

        猜你喜欢
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        • 2019-09-13
        • 2011-03-05
        • 2022-08-14
        • 2016-06-14
        • 1970-01-01
        • 2011-02-09
        相关资源
        最近更新 更多