2
votes

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(); }
2

2 Answers

12
votes

@ 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 ☺

6
votes

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.