summaryrefslogblamecommitdiff
path: root/test/files/run/finally.scala
blob: 635123cc4d904e7789da533241e50f2842ca5353 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
 
                         









                                                                
  
                                                                




                   
                                              






                                        
                                          
                      








                                   
                                                               
                        









                                             
                     

























                                                          
        

















                                                                             
                            


















                                         
   
 







                                              
 
object Test extends App {


  // test that finally is not covered by any exception handlers.
  def throwCatchFinally {
    try {
      bar
    } catch {
      case e => println(e)
    }
  }
  
  // test that finally is not covered by any exception handlers.
  def bar {
    try {
      println("hi")
    }
    catch {
      case e => println("SHOULD NOT GET HERE")
    }
    finally {
      println("In Finally")
      throw new RuntimeException("ouch")
    }
  }

  // return in catch (finally is executed)
  def retCatch {      
    try {
      throw new Exception
    } catch {
      case e =>
        println(e);
        return
    } finally println("in finally")
  }

  // throw in catch (finally is executed, exception propagated)
  def throwCatch {      
    try {
      throw new Exception
    } catch {
      case e =>
        println(e);
        throw e
    } finally println("in finally")
  }

  // return inside body (finally is executed)
  def retBody {      
    try {
      return
    } catch {
      case e =>
        println(e);
        throw e
    } finally println("in finally")
  }

  // throw inside body (finally and catch are executed)
  def throwBody {
    try {
      throw new Exception
    } catch {
      case e =>
        println(e);
    } finally println("in finally")
  }

  // return inside finally (each finally is executed once)
  def retFinally {
    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 {
    try {
      try println("body")
      finally {
        println("in finally")
        throw new Exception
      }
    } catch {
      case e => println(e)
    }
  }

  // nested finallies with return value
  def nestedFinalies: Int = 
    try {
      try {
        return 10
      } finally {
        try { () } catch { case _ => () }
        println("in finally 1")
      }
    } finally {
      println("in finally 2")
    }

  def test[A](m: => A, name: String) {
    println("Running %s".format(name))
    try {
      m
    } catch {
      case e => 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")
}