2010-05-25 11 views

Trả lời

37

Thật vậy - tôi cũng thấy nó khá khó hiểu! Dưới đây là một vấn đề mà tôi có một số tài sản có thể là một ngày parseable:

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 này cho một dạng hàm số:

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

Trong đoạn mã trên, biến catching(t) either expr sẽ dẫn đến một Either[T, E] nơi T là loại có thể ném và E là loại của biểu thức. Điều này sau đó có thể được chuyển đổi thành một giá trị cụ thể thông qua một fold.

Hoặc một phiên bản nữa:

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

Đây có lẽ là rõ ràng hơn một chút - sau đây là tương đương:

handling(t) by g apply f 
try { f } catch { case _ : t => g } 
+11

Một giải pháp thay thế khác: 'failAsValue (classOf [PE]) (ngày mới) {parseDate}'. :) – missingfaktor

5

Dưới đây là một số ví dụ:

trình biên dịch/scala/công cụ/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) } 
    } 

trình biên dịch/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 
    } 
    } 

trình biên dịch/scala/tools/nsc/io/Process.scala

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

thư viện/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

bạn có thể xây dựng một chút về các ví dụ bắt ... unwrapping? –