2011-10-11 49 views
0

libphonenumber库中,PhoneNumberUtil.parse函数抛出NumberParseException。我想优雅地处理这个异常。在Clojure中捕获自定义异常

我跑以下一次性脚本(使用java -cp path/to/clojure.jar:path/to/libphonenumber.jar clojure.main -i scratch.clj调用):

(import '(com.google.i18n.phonenumbers PhoneNumberUtil)) 

(defn parse-phone-no 
    "Convert the phone number to standard form, using the libphonenumber class. 
    Arguments: 
    raw-phone-no - the phone number to convert 
    Returns: 
    the canonical version of the phone number, or nil if the phone number was 
    invalid." 
    [raw-phone-no] 
    (do 
    (def phone-util (PhoneNumberUtil/getInstance)) 
    (try 
     (do 
     (def us-number (.parse phone-util raw-phone-no "US")) 
     (.getNationalNumber us-number)) 
     (catch NumberParseException e 
     nil)))) 

(println (parse-phone-no "5")) 

如果我有一个通用的catch Exception运行它,然后它工作正常,但是任何的catch NumberParseExceptioncatch PhoneNumberUtil/NumberParseExceptioncatch (.NumberParseException phoneUtil)组合给出Unable to resolve classname错误。我想赶上自定义异常并让其他人滑动,所以我会很感激您的帮助。

谢谢,凯文

+0

你也应该考虑用'let'而不是'def'来创建局部变量(在这种情况下,“考虑”的意思是:“绝对做到这一点,但如果你仍然在学习Clojure,你可以暂时搁置一段时间“)。令人惊讶的是,我现在找不到一个SO问题来联系你:抱歉。 – amalloy

+0

也许问一个问题并自己回答?因为是的,我知道我的语法真的很糟糕。 –

回答

4

就像PhoneNumberUtil,你需要或者importNumberParseException命名空间或在catch表达提供其全部合格的包装。

如果该异常是内部类,它将在clojure中转换为OuterClass $ InnerClass(您仍然需要导入或使用它的包限定)。