Using scala.util.control.Exception

后端 未结 2 735
夕颜
夕颜 2021-02-01 03:34

Does anybody have good examples of using scala.util.control.Exception version 2.12.0 (version 2.8.0), ? I am struggling to figure it out from the types.

相关标签:
2条回答
  • 2021-02-01 03:51

    Indeed - I also find it pretty confusing! Here's a problem where I have some property which may be a parseable date:

    def parse(s: String) : Date = new SimpleDateFormat("yyyy-MM-dd").parse(s)
    def parseDate = parse(System.getProperty("foo.bar"))
    
    type PE = ParseException
    import scala.util.control.Exception._
    
    val d1 = try { 
                 parseDate
               } catch { 
                 case e: PE => new Date
               }
    

    Switching this to a functional form:

    val date =
         catching(classOf[PE]) either parseDate fold (_ => new Date, identity(_) ) 
    

    In the above code, turns catching(t) either expr will result in an Either[T, E] where T is the throwable's type and E is the expression's type. This can then be converted to a specific value via a fold.

    Or another version again:

    val date =
         handling(classOf[PE]) by (_ => new Date) apply parseDate
    

    This is perhaps a little clearer - the following are equivalent:

    handling(t) by g apply f 
    try { f } catch { case _ : t => g }
    
    0 讨论(0)
  • 2021-02-01 03:55

    Here are some examples:

    compiler/scala/tools/nsc/interpreter/InteractiveReader.scala

      def readLine(prompt: String): String = {
        def handler: Catcher[String] = {
          case e: IOException if restartSystemCall(e) => readLine(prompt)
        }
        catching(handler) { readOneLine(prompt) }
      }
    

    compiler/scala/tools/nsc/Interpreter.scala

      /** We turn off the binding to accomodate ticket #2817 */
      def onErr: Catcher[(String, Boolean)] = {
        case t: Throwable if bindLastException =>
          withoutBindingLastException {
            quietBind("lastException", "java.lang.Throwable", t)
            (stringFromWriter(t.printStackTrace(_)), false)
          }
      }
    
      catching(onErr) {
        unwrapping(wrapperExceptions: _*) {
          (resultValMethod.invoke(loadedResultObject).toString, true)
        }
      }
    
    ...
    
      /** Temporarily be quiet */
      def beQuietDuring[T](operation: => T): T = {
        val wasPrinting = printResults
        ultimately(printResults = wasPrinting) {
          printResults = false
          operation
        }
      }
    
      /** whether to bind the lastException variable */
      private var bindLastException = true
    
      /** Temporarily stop binding lastException */
      def withoutBindingLastException[T](operation: => T): T = {
        val wasBinding = bindLastException
        ultimately(bindLastException = wasBinding) {
          bindLastException = false
          operation
        }
      }
    

    compiler/scala/tools/nsc/io/Process.scala

      def exitValue(): Option[Int] =
        catching(classOf[IllegalThreadStateException]) opt process.exitValue()
    

    library/scala/xml/include/sax/Main.scala

    def saxe[T](body: => T) = catching[T](classOf[SAXException]) opt body
    
    ...
    
       ignoring(classOf[SAXException]) {
         includer.setProperty(lexicalHandler, s)
         s setFilter includer
       }
    
    0 讨论(0)
提交回复
热议问题