2011-10-17 20 views
19

我已閱讀並嘗試過Scala 2.9 try ... catch功能,並讓我思考可能性。除了保存幾行代碼之外,我真的會用它來做什麼?Scala 2.9的try ... catch泛化的用例是什麼?

Scala 2.9 Final Release Notes

+0

我不確定我會用它....但是您可以使用任何*(符合)PartialFunction ...在其他地方有統一的錯誤處理? (說'ignoreTheseSillyClosableExceptions'。)另外,「這很酷」,斯卡拉可以這樣表達它;-) – 2011-10-17 02:42:18

+0

靈感:Paul Phillips提供了一個激勵的例子,他實現了這個:http://www.scala-lang.org/node/8070 –

+3

這個問題最好用一個例子或至少一個鏈接。 – ziggystar

回答

24

用例是能夠有一般錯誤處理整個應用程序。假設您想通過向管理員發送電子郵件來處理應用程序中的所有FileNotFoundException。以前,你必須做這樣的:

// Globally 
val fileNotFound: PartialFunction[Throwable, Unit] = { 
    case e: FileNotFoundException => 
    // Create report and send the e-mail 
} 

// On each try-catch-block 
try { 
    // Open file 
} 
catch { 
    case fnf: FileNotFoundException => fileNotFound(fnf) 
} 

現在你只是做:

try { 
    // Open file 
} catch fileNotFound 

這也有很好的優勢,你可以使用orElse方法鏈接幾個這樣的異常處理程序部分功能:

val fileErrors = fileNotFound orElse endOfFile orElse invalidFormat 

然後只是在需要文件異常處理的地方使用。例如,可以基於應用程序的配置文件動態組合這樣的錯誤處理程序。這比任何地方的模式匹配都要麻煩,並且調用正確的處理程序。

一個有用的東西可以在部分函數之上實現,它是andAlso運算符,它用作兩個部分函數的排序運算符。如果您想在完成通用錯誤處理之後執行特定於某個特定try-catch塊的錯誤處理,這將非常有用。

implicit def pf2ops(pf: PartialFunction[Throwable, Unit]) = new { 
    def andAlso(localpf: PartialFunction[Throwable, Unit]) = new PartialFunction[Throwable, Unit] { 
    def apply(t: Throwable) = { 
     if (pf.isDefinedAt(t)) pf(t) 
     localpf(t) 
    } 
    def isDefinedAt(t: Throwable) = pf.isDefinedAt(t) || localpf.isDefinedAt(t) 
    } 
} 

然後你可以這樣做:

scala> try { 
    | throw new java.io.FileNotFoundException 
    | } catch fnf andAlso { 
    | case e: Exception => println("I don't know, but something is specific to this particular block.") 
    | } 
I don't know, but something is specific to this particular block. 

我想你可以用andAlso確切的語義和意義(和名稱)進一步發揮。

+0

很好的答案 - 我認爲andAlso部分是我失蹤的一點。 – Seth

7

好的回答axel22,但我認爲其引入的真正原因是別的。 try/catch/finally處理介紹了一個特例。您使用了部分函數文字,但您實際上無法用部分函數替換它。現在,catch只是收到一個部分函數,​​在語言中的一個更特殊情況已經消失。

+0

我也喜歡這個答案:) – Seth

+0

這實際上證實了我最初的推理 - 這主要是一個「整潔」功能。 – Seth

+0

同意 - 最好的一致性原則 - 作爲結果的可用性的廣義構造。 – axel22