2010-07-11 49 views
14

我有以下代碼:在Scala 2.7的一個case語句中匹配(和綁定)兩個異常類?

try { 
    < ... some JSON parsing code .. > 
} 
catch { 
    case e:ClassCastException => throw new ParseException(body, e) 
    case e:JSONException => throw new ParseException(body, e) 
} 

這似乎過於囉嗦。我試過

case e:ClassCastException | e:JSONException => throw new ParseException(body, e) 

但斯卡拉不會讓我綁定e這兩種類型 - 公平的。在處理程序中,我只需要將e視爲類型Exception,但如果它是其中一個特定類,我只想匹配它。像具有匹配系後一個條件,如:

case e:Exception(ClassCastException|JSONException) => throw new ParseException(body, e) 

這顯然不是正確的語法,但希望你明白我的意思。這樣的事情可能嗎?

回答

24

您不能在Pattern Alternatives(PatternA | PatternB)中引入綁定。但是您可以使用Pattern Binder(name @ Pattern)將名稱與Pattern Alternatives的結果綁定。

try { 
    < ... some JSON parsing code .. > 
} catch { 
    case e @ (_: ClassCastException | _: JSONException) => throw new ParseException(body, e) 
} 
8

你可以使用新的2.8控制結構:

def foo = //JSON parsing code 

import util.control.Exception._ 
handling(classOf[ClassCastException], classOf[JSONException]) by (t => throw new ParseException(t)) apply foo 

(有可能是有一個錯誤,我無法找到該jabscreen的REPL

+0

這裏有一個REPL: http://www.simplyscala.com/2.8 :) – retronym 2010-07-11 14:30:00

+0

這不是Ruby的一個,是嗎? – 2010-07-11 15:01:13

+0

很好的答案,雖然我現在堅持2.7,我應該指定;我已經更新了這個問題以反映現在。 – gfxmonk 2010-07-12 03:04:17