src/Pure/General/exn.scala
author wenzelm
Sun, 04 Sep 2011 15:49:59 +0200
changeset 44699 5199ee17c7d7
parent 44158 fe6d1ae7a065
child 45667 546d78f0d81f
permissions -rw-r--r--
property "tooltip-dismiss-delay" is edited in ms, not seconds; explicit tooltip_dismiss_delay boundaries for further robustness;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34136
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/exn.scala
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
     3
43761
e72ba84ae58f tuned signature -- corresponding to Scala version;
wenzelm
parents: 34313
diff changeset
     4
Support for exceptions (arbitrary throwables).
34136
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
     5
*/
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
     6
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
     7
package isabelle
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
     8
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
     9
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    10
object Exn
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    11
{
44158
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    12
  /* exceptions as values */
34136
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    13
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    14
  sealed abstract class Result[A]
43762
wenzelm
parents: 43761
diff changeset
    15
  case class Res[A](res: A) extends Result[A]
wenzelm
parents: 43761
diff changeset
    16
  case class Exn[A](exn: Throwable) extends Result[A]
34136
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    17
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    18
  def capture[A](e: => A): Result[A] =
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    19
    try { Res(e) }
34313
2f890016afab treat *all* JVM throwables as "exceptions", cf. ML version;
wenzelm
parents: 34300
diff changeset
    20
    catch { case exn: Throwable => Exn[A](exn) }
34136
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    21
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    22
  def release[A](result: Result[A]): A =
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    23
    result match {
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    24
      case Res(x) => x
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    25
      case Exn(exn) => throw exn
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    26
    }
44158
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    27
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    28
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    29
  /* message */
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    30
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    31
  private val runtime_exception = Class.forName("java.lang.RuntimeException")
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    32
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    33
  def message(exn: Throwable): String =
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    34
    if (exn.getClass == runtime_exception) {
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    35
      val msg = exn.getMessage
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    36
      if (msg == null) "Error" else msg
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    37
    }
fe6d1ae7a065 clarified Exn.message;
wenzelm
parents: 43762
diff changeset
    38
    else exn.toString
34136
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    39
}
3dcb46ae6185 added basic library -- Scala version;
wenzelm
parents:
diff changeset
    40