理解Scala中的捕获

理解Scala中的捕获,scala,exception,try-catch,Scala,Exception,Try Catch,我写了以下简单的例子: def main(args: Array[String]) = { try{ throw new IllegalArgumentException } catch { case Ex(e) => println("IllegalArgumentException was thrown") } } object Ex{ def unapply(arg: Throwable): Option[Throwable] =

我写了以下简单的例子:

def main(args: Array[String]) = {
    try{
      throw new IllegalArgumentException
    } catch {
      case Ex(e) => println("IllegalArgumentException was thrown")
    }
}

object Ex{
  def unapply(arg: Throwable): Option[Throwable] = arg match {
    case arg: IllegalArgumentException => Some(arg)
    case _ => None
  }
}
我被它的工作原理弄糊涂了。在catch子句中,我们甚至没有声明e。另一个是,在catch子句中,我们与一些[可丢弃的]进行匹配,而不是与可丢弃的本身进行匹配。因此,我试着做以下几点:

catch {
      case Ex(e) => println("IllegalArgumentException was thrown")
      case None => println("None")  //error, found None.type required Throwable
    }
但它不起作用。为什么?我们与一些[被抛弃的]对手较量。“没有”有什么问题?

提取器

你正在和提取器打交道。不仅在catch子句中,而且在处理模式匹配时。某些复杂类型的脱胶是为了进行模式匹配

使用对象中的unapply方法将复杂类型分解为简单元组

在您的情况下,当Exe用于内部模式匹配时,将调用unapply方法。unapply方法的返回类型应该是某个元组的选项,也可以是单个值

因此,如果未返回任何值,则匹配失败。当返回一些时,scala会尝试匹配元组的内部值

来到编译错误

None是不可丢弃的,None不是其unapply方法返回选项[throwable]的对象,因此Scala编译器给出编译错误

比如说

Scala REPL

提取器

你正在和提取器打交道。不仅在catch子句中,而且在处理模式匹配时。某些复杂类型的脱胶是为了进行模式匹配

使用对象中的unapply方法将复杂类型分解为简单元组

在您的情况下,当Exe用于内部模式匹配时,将调用unapply方法。unapply方法的返回类型应该是某个元组的选项,也可以是单个值

因此,如果未返回任何值,则匹配失败。当返回一些时,scala会尝试匹配元组的内部值

来到编译错误

None是不可丢弃的,None不是其unapply方法返回选项[throwable]的对象,因此Scala编译器给出编译错误

比如说

Scala REPL


@pamu是的,你的问题是关于提取器而不是真正的例外。@pamu是的,你的问题是关于提取器而不是真正的例外。
class Foo(val a: Int)

object Foo {
  def unapply(foo: Foo): Option[Int] = Some(foo.a)
}

scala> class Foo(val a: Int)
defined class Foo

scala>

scala> object Foo {
     |   def unapply(foo: Foo): Option[Int] = Some(foo.a)
     | }
defined object Foo
warning: previously defined class Foo is not a companion to object Foo.
Companions must be defined together; you may wish to use :paste mode for this.

scala> new Foo(10) match { case Foo(value) => println("matched: " + value) }
matched: 10