author | wenzelm |
Tue, 29 Nov 2011 21:29:53 +0100 | |
changeset 46548 | cd41e3903fbf |
parent 46538 | 546d78f0d81f |
child 49491 | 44f56fe01528 |
permissions | -rw-r--r-- |
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 |