Используя scala.util.control. Исключение

Делает у кого-либо есть хорошие примеры использования scala.util.control.Exception версия 2.12.0 (версия 2.8.0)? Я изо всех сил пытаюсь изобразить его из типов.

31
задан isaias-b 3 March 2017 в 11:47
поделиться

2 ответа

В самом деле - я тоже нахожу это довольно запутанным! Вот проблема, связанная с тем, что у меня есть свойство, которое может быть анализируемой датой:

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
           }

Переключение этого в функциональную форму:

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

В приведенном выше коде превращается ловушка (t) либо expr приведет к Либо [T, E] , где T - тип бросаемого объекта, а E - тип выражения. Затем его можно преобразовать в конкретное значение с помощью свертки .

Или еще одна версия:

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

Возможно, это немного яснее - следующие эквиваленты:

handling(t) by g apply f 
try { f } catch { case _ : t => g }
37
ответ дан 27 November 2019 в 22:34
поделиться

Вот некоторые примеры:

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
   }
5
ответ дан 27 November 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: