diff options
Diffstat (limited to 'tests/run/finally.scala')
-rw-r--r-- | tests/run/finally.scala | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/tests/run/finally.scala b/tests/run/finally.scala new file mode 100644 index 000000000..64324abc4 --- /dev/null +++ b/tests/run/finally.scala @@ -0,0 +1,127 @@ + +object Test extends dotty.runtime.LegacyApp { + + + // test that finally is not covered by any exception handlers. + def throwCatchFinally: Unit = { + try { + bar + } catch { + case e: Throwable => println(e) + } + } + + // test that finally is not covered by any exception handlers. + def bar: Unit = { + try { + println("hi") + } + catch { + case e: Throwable => println("SHOULD NOT GET HERE") + } + finally { + println("In Finally") + throw new RuntimeException("ouch") + } + } + + // return in catch (finally is executed) + def retCatch: Unit = { + try { + throw new Exception + } catch { + case e: Throwable => + println(e); + return + } finally println("in finally") + } + + // throw in catch (finally is executed, exception propagated) + def throwCatch: Unit = { + try { + throw new Exception + } catch { + case e: Throwable => + println(e); + throw e + } finally println("in finally") + } + + // return inside body (finally is executed) + def retBody: Unit = { + try { + return + } catch { + case e: Throwable => + println(e); + throw e + } finally println("in finally") + } + + // throw inside body (finally and catch are executed) + def throwBody: Unit = { + try { + throw new Exception + } catch { + case e: Throwable => + println(e); + } finally println("in finally") + } + + // return inside finally (each finally is executed once) + def retFinally: Unit = { + try { + try println("body") + finally { + println("in finally 1") + return + } + } finally println("in finally 2") + } + + + // throw inside finally (finally is executed once, exception is propagated) + def throwFinally: Unit = { + try { + try println("body") + finally { + println("in finally") + throw new Exception + } + } catch { + case e: Throwable => println(e) + } + } + + // nested finallies with return value + def nestedFinalies: Int = + try { + try { + return 10 + } finally { + try { () } catch { case _: Throwable => () } + println("in finally 1") + } + } finally { + println("in finally 2") + } + + def test[A](m: => A, name: String): Unit = { + println("Running %s".format(name)) + try { + m + } catch { + case e: Throwable => println("COUGHT: " + e) + } + println("-" * 40) + } + + test(throwCatchFinally, "throwCatchFinally") + test(retCatch, "retCatch") + test(throwCatch, "throwCatch") + test(retBody, "retBody") + test(throwBody, "throwBody") + test(retFinally, "retFinally") + test(throwFinally, "throwFinally") + test(nestedFinalies, "nestedFinalies") +} |