src/Pure/General/exn.scala
author wenzelm
Tue, 29 Nov 2011 21:29:53 +0100
changeset 46548 cd41e3903fbf
parent 46538 546d78f0d81f
child 49491 44f56fe01528
permissions -rw-r--r--
separate compilation of PIDE vs. Pure sources, which enables independent Scala library;
wenzelm@34145
     1
/*  Title:      Pure/General/exn.scala
wenzelm@46548
     2
    Module:     PIDE
wenzelm@34145
     3
    Author:     Makarius
wenzelm@34145
     4
wenzelm@44633
     5
Support for exceptions (arbitrary throwables).
wenzelm@34145
     6
*/
wenzelm@34145
     7
wenzelm@34145
     8
package isabelle
wenzelm@34145
     9
wenzelm@34145
    10
wenzelm@34145
    11
object Exn
wenzelm@34145
    12
{
wenzelm@45037
    13
  /* exceptions as values */
wenzelm@34145
    14
wenzelm@34145
    15
  sealed abstract class Result[A]
wenzelm@44634
    16
  case class Res[A](res: A) extends Result[A]
wenzelm@44634
    17
  case class Exn[A](exn: Throwable) extends Result[A]
wenzelm@34145
    18
wenzelm@34145
    19
  def capture[A](e: => A): Result[A] =
wenzelm@34145
    20
    try { Res(e) }
wenzelm@34316
    21
    catch { case exn: Throwable => Exn[A](exn) }
wenzelm@34145
    22
wenzelm@34145
    23
  def release[A](result: Result[A]): A =
wenzelm@34145
    24
    result match {
wenzelm@34145
    25
      case Res(x) => x
wenzelm@34145
    26
      case Exn(exn) => throw exn
wenzelm@34145
    27
    }
wenzelm@45037
    28
wenzelm@45037
    29
wenzelm@45037
    30
  /* message */
wenzelm@45037
    31
wenzelm@45037
    32
  private val runtime_exception = Class.forName("java.lang.RuntimeException")
wenzelm@45037
    33
wenzelm@45037
    34
  def message(exn: Throwable): String =
wenzelm@45037
    35
    if (exn.getClass == runtime_exception) {
wenzelm@45037
    36
      val msg = exn.getMessage
wenzelm@45037
    37
      if (msg == null) "Error" else msg
wenzelm@45037
    38
    }
wenzelm@45037
    39
    else exn.toString
wenzelm@34145
    40
}
wenzelm@34145
    41