理解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