Cara mendapatkan pengecualian di konsol Scala

Saya ingin membuat objek pengecualian menjadi val di konsol yang dapat saya gunakan. Sesuatu seperti:

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

sehingga saya bisa melakukan e.toString atau sejenisnya di konsol.

Bagaimana saya bisa melakukan ini?


person SRobertJames    schedule 10.12.2014    source sumber


Jawaban (4)


Anda dapat menggunakan Try, dan mencocokkannya:

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

Atau jika Anda hanya bermain-main di konsol, Anda dapat memaksanya:

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

Hanya saja, jangan menangkapnya.

$ 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> 

Juga, secara lebih langsung:

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

Anda tidak dapat menyelundupkan val keluar dari lingkup dalam, yang merupakan isi dari blok tangkapan. Namun, Anda dapat menggunakan scala.util.Either untuk menunjukkan bahwa Anda dapat memiliki salah satu dari dua nilai kembalian:

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
Selamat, Anda telah mencapai enam angka. Anda memerlukan pelampung untuk skor rep Anda. - person som-snytt; 10.12.2014
comment
@ som-snytt - Saya yakin Anda akan memperhatikan jika hal-hal aneh mulai terjadi sekitar 16.777.217. - person Rex Kerr; 10.12.2014

Jangan lupa tidak ada yang menghentikan Anda untuk mengembalikan pengecualian, seperti nilai lainnya, dari blok 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

Namun, Anda kehilangan informasi tipe kecuali Anda mengembalikan sesuatu dengan tipe yang sama di blok try:

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

Dalam hal ini Anda sekarang kehilangan hasil try jika tidak ada pengecualian.

Lihat jawaban lain untuk solusi yang lebih aman seperti Try atau Either.

person Dan Getz    schedule 10.12.2014