src/Pure/RAW/exn.scala
changeset 62492 0e53fade87fe
parent 61925 ab52f183f020
equal deleted inserted replaced
62491:7187cb7a77c5 62492:0e53fade87fe
     8 package isabelle
     8 package isabelle
     9 
     9 
    10 
    10 
    11 object Exn
    11 object Exn
    12 {
    12 {
       
    13   /* user errors */
       
    14 
       
    15   class User_Error(message: String) extends RuntimeException(message)
       
    16   {
       
    17     override def equals(that: Any): Boolean =
       
    18       that match {
       
    19         case other: User_Error => message == other.getMessage
       
    20         case _ => false
       
    21       }
       
    22     override def hashCode: Int = message.hashCode
       
    23 
       
    24     override def toString: String = "ERROR(" + message + ")"
       
    25   }
       
    26 
       
    27   object ERROR
       
    28   {
       
    29     def apply(message: String): User_Error = new User_Error(message)
       
    30     def unapply(exn: Throwable): Option[String] = user_message(exn)
       
    31   }
       
    32 
       
    33   def error(message: String): Nothing = throw ERROR(message)
       
    34 
       
    35   def cat_message(msg1: String, msg2: String): String =
       
    36     if (msg1 == "") msg2
       
    37     else if (msg2 == "") msg1
       
    38     else msg1 + "\n" + msg2
       
    39 
       
    40   def cat_error(msg1: String, msg2: String): Nothing =
       
    41     error(cat_message(msg1, msg2))
       
    42 
       
    43 
    13   /* exceptions as values */
    44   /* exceptions as values */
    14 
    45 
    15   sealed abstract class Result[A]
    46   sealed abstract class Result[A]
    16   {
    47   {
    17     def user_error: Result[A] =
    48     def user_error: Result[A] =
    86 
   117 
    87   /* message */
   118   /* message */
    88 
   119 
    89   def user_message(exn: Throwable): Option[String] =
   120   def user_message(exn: Throwable): Option[String] =
    90     if (exn.getClass == classOf[RuntimeException] ||
   121     if (exn.getClass == classOf[RuntimeException] ||
    91         exn.getClass == classOf[Library.User_Error])
   122         exn.getClass == classOf[User_Error])
    92     {
   123     {
    93       val msg = exn.getMessage
   124       val msg = exn.getMessage
    94       Some(if (msg == null || msg == "") "Error" else msg)
   125       Some(if (msg == null || msg == "") "Error" else msg)
    95     }
   126     }
    96     else if (exn.isInstanceOf[java.io.IOException])
   127     else if (exn.isInstanceOf[java.io.IOException])