Peter Krauss
Peter Krauss

Reputation: 13930

Try/catch item with strange syntax

Strange syntax in this code fragment:

var result =
  try {
     Process(bl).!!
  } catch {
    case e: Exception =>
      log.error(s"Error on query: ${hql}\n")
      "Etc etc" + "Query: " + hql
  }

Why not using separator like , or ; after log.error(s"...")?

The catch statement is returning one or two values?

PS: there are a better Guide tham this one, with all Scala syntax alternatives?

Upvotes: 0

Views: 82

Answers (1)

Mario Galic
Mario Galic

Reputation: 48420

Newline characters can terminate statements

semi ::= ‘;’ | nl {nl}

Scala is a line-oriented language where statements may be terminated by semi-colons or newlines. A newline in a Scala source text is treated as the special token “nl” ...

IMHO, newline character \n is just as good of a statement terminator as semicolon character ;. However, it may have an advantage over ; in that it is invisible to humans which perhaps has the benefit of less code clutter. It might seem strange because it is invisible, but rest assured it is there silently doing its job delimiting statements. Perhaps it might become less strange if we try to imagine it like so

1 + 42'\n'  // separating with invisible character \n
1 + 42;     // separating with visible character ;

Note that we must use semicolons when writing multiple statements on the same line

log.error(s"Error on query: ${hql}\n"); "Etc etc" + "Query: " + hql

Addressing the comment, AFAIU, your confusion stems from misunderstanding how pattern matching anonymous functions and block expressions work. Desugared handler function

case e: Exception =>
  log.error(s"Error on query: ${hql}\n")
  "Etc etc" + "Query: " + hql

is equivalent to something like

case e: Exception => {
  log.error(s"Error on query: ${hql}\n"); // side-effect statement that just logs an error
  return "Etc etc" + "Query: " + hql;     // final expression becomes the return value of the block
}

Hence, "one block with two branches into it" is not the correct understanding, instead there is only a single code path through your particular function.

Upvotes: 2

Related Questions