简体   繁体   中英

Better syntax for Scala anonymous function?

Experimenting with Scala... I'm trying to define something analogous to the "@" hack in PHP (which means, ignore any exception in the following statement).

I managed to get a definition that works:

def ignoreException(f: () => Unit) = {
      try {
        f();
      }
      catch {
        case e: Exception => println("exception ignored: " + e);
      }
    }

And use it like this:

ignoreException( () => { someExceptionThrowingCodeHere() } );

Now here is my question... Is there anyway I can simplify the usage and get rid of the () =>, and maybe even the brackets?

Ultimately I'd like the usage to be something like this:

`@` { someExceptionThrowingCodeHere(); }

@ is reserved in Scala (for pattern matching), but would you accept @@ ?

scala> def @@(block: => Unit): Unit = try {
  block
} catch {
  case e => printf("Exception ignored: %s%n", e)
}   
$at$at: (=> Unit)Unit

scala> @@ {
  println("before exception")
  throw new RuntimeException()
  println("after exception")
}
before exception
Exception ignored: java.lang.RuntimeException

I'm not convinced this is a good idea, however ☺

You don't have to use a function as your parameter, a "by-name" parameter will do:

def ignoreException(f: =>Unit) = {
  try {
    f
  }
  catch {
    case e: Exception => println("exception ignored: " + e)
  }
}

ignoreException(someExceptionThrowingCodeHere())

Eric.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM