Case this works:
Seq(fromDir, toDir) find (!_.isDirectory) foreach (println(_))
Whereas this doesn\'t:
Seq(fromDir, toDir)
The difference is whether _ stands for the whole parameter, or is part of an expression. Depending on which, it falls into one of the two following categories:
Seq(fromDir, toDir) find (!_.isDirectory) foreach (println(_))
translates into
Seq(fromDir, toDir) find (!_.isDirectory) foreach ((x$1) => println(x$1))
Seq(fromDir, toDir) find (!_.isDirectory) foreach (throw new Exception(_.toString))
translates into
Seq(fromDir, toDir) find (!_.isDirectory) foreach (throw new Exception((x$1) => x$1.toString))
This has already been addressed in a related question. Underscores extend outwards to the closest closing Expr : top-level expressions or expressions in parentheses.
(_.toString) is an expression in parentheses. The argument you are passing to Exception in the error case is therefore, after expansion, the full anonymous function (x$1) => x$1.toString of type A <: Any => String, while Exception expects a String.
In the println case, _ by itself isn't of syntactic category Expr, but (println (_)) is, so you get the expected (x$0) => println(x$0).