aboutsummaryrefslogtreecommitdiff
path: root/tests/run/finally.scala
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run/finally.scala')
-rw-r--r--tests/run/finally.scala127
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")
+}