Skip to content

can't try catch using a PartialFunction[Throwable, _] #8662

Closed
@ohze

Description

@ohze

Minimized code

object Main {
  class EThrow extends Exception
  class ECatch extends Exception

  def ok(): Unit =
    try throw new EThrow
    catch { case _: ECatch => }

  def notOk(): Unit = {
    val pf: PartialFunction[Throwable, Unit] = {
      case e: ECatch =>
    }
    try throw new EThrow
    catch pf
  }

  def test(f: => Unit): Unit =
    try f catch {
      case _: EThrow    => println("OK")
      // case e: Throwable => println("! expect an EThrow but got " + e.getClass)
    }

  def main(args: Array[String]): Unit = {
    test { ok() }
    test { notOk() }
  }
}

Runtime output

[error] Exception in thread "main" scala.MatchError: Main$EThrow (of class Main$EThrow)
[error] 	at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:341)
[error] 	at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:339)
[error] 	at Main$$anon$1.applyOrElse(Main.scala:11)
[error] 	at Main$$anon$1.applyOrElse(Main.scala:11)
[error] 	at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
[error] 	at Main$.notOk(Main.scala:14)
[error] 	at Main$.main$$anonfun$2(Main.scala:25)
[error] 	at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error] 	at Main$.test(Main.scala:18)
[error] 	at Main$.main(Main.scala:25)
[error] 	at Main.main(Main.scala)

Expectation

running successfully as in scala 2 (println "OK" 2 times)

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions