2010-07-11 59 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