Как получить исключение в консоли Scala

Я хотел бы, чтобы объект исключения выбрасывал val в консоли, которую я могу использовать. Что-то типа:

 try { ... } catch { e => make e a val }

так что я могу сделать e.toString или что-то подобное в консоли.

Как я могу это сделать?


person SRobertJames    schedule 10.12.2014    source источник


Ответы (4)


Вы можете использовать Try и либо сопоставить его:

Try(...) match {
   case Success(value) => // do something with `value`
   case Failure(e) => // `e` is the `Throwable` that caused the operation to fail
}

Или, если вы просто возитесь в консоли, вы можете принудительно:

scala> val e = Try(1/0).failed.get
e: Throwable = java.lang.ArithmeticException: / by zero
person Michael Zajac    schedule 10.12.2014

Только не лови.

$ scala
Welcome to Scala version 2.11.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_20).
Type in expressions to have them evaluated.
Type :help for more information.

scala> ???
scala.NotImplementedError: an implementation is missing
  at scala.Predef$.$qmark$qmark$qmark(Predef.scala:225)
  ... 33 elided

scala> lastException
res1: Throwable = scala.NotImplementedError: an implementation is missing

scala> 

Кроме того, более прямо:

scala> try { ??? } catch { case e: Throwable => $intp.bind("oops", e) }
oops: Throwable = scala.NotImplementedError: an implementation is missing
res2: scala.tools.nsc.interpreter.IR.Result = Success

scala> oops.toString
res3: String = scala.NotImplementedError: an implementation is missing
person som-snytt    schedule 10.12.2014

Вы не можете переправить val из внутренней области видимости, которая является телом блока catch. Однако вы можете использовать scala.util.Either, чтобы указать, что у вас может быть одно из двух возвращаемых значений:

import scala.util._
val answer = try { Right(...) } catch { case e: Throwable => Left(e) }
answer match {
  case Right(r) => // Do something with the successful result r
  case Left(e) => // Do something with the exception e
}
person Rex Kerr    schedule 10.12.2014
comment
Поздравляю с шестизначной суммой. Вам понадобится поплавок для вашего счета репутации. - person som-snytt; 10.12.2014
comment
@som-snytt - надеюсь, вы заметите, если около 16 777 217 начнут происходить странные вещи. - person Rex Kerr; 10.12.2014

Не забывайте, что ничто не мешает вам вернуть исключение, как и любое другое значение, из блока catch:

scala> val good = try { 1.hashCode } catch { case e: Throwable => e }
good: Any = 1

scala> val bad = try { null.hashCode } catch { case e: Throwable => e }
bad: Any = java.lang.NullPointerException

Однако вы потеряете информацию о типе, если не вернете что-то того же типа в блоке try:

scala> val badOrNull = try { null.hashCode; null } catch { case e: Throwable => e }
badOrNull: Throwable = java.lang.NullPointerException

В этом случае вы теперь теряете результат try, если нет исключения.

См. другие ответы для более безопасных решений, таких как Try или Either.

person Dan Getz    schedule 10.12.2014