2012-02-26 89 views
6

我正在編寫一個封裝REST API的庫。我創建的包裝器使用GSON將json反序列化爲我的對象。基本上,像這樣...如何正確處理重要的未經檢查的異常

public Post getPost(url) throws IOException { 
    String jsonString = httpClient.get(url); 
    Post p = gson.fromJson(jsonString, Post.class); 
    // return Post to client and let client do something with it. 
} 

如果我理解正確,IOException是一個檢查異常。我告訴我的客戶:嗨,夥計 - 你最好小心並從這個例外中恢復過來。現在,我的客戶端可以在try/catch中包裝呼叫,並確定如果發生網絡故障,該怎麼辦。

GSON fromJson()方法拋出JsonSyntaxException異常。我相信在Java世界中這是沒有檢查的,因爲它的一個超類是RuntimeException,也因爲我不需要添加try/catch或另一個「拋出」像IOException。

假設我到目前爲止所說的是正確的 - API和客戶端應該如何處理這種情況?如果json字符串是垃圾,我的客戶端將由於JsonSyntaxException而失敗,因爲它沒有被選中。

// Client 
PostService postService = new PostService(); 
try{ 
    Post p = postService.getPost(urlString); 
    // do something with post 
}catch (IOException){ 
    // handle exception 
} 
// ok, what about a JsonSyntaxException???? 

處理這些情況的最佳方法是什麼?

回答

6

您被允許捕獲未經檢查的異常。只需將catch(JsonSyntaxException e)添加到您的try-catch塊。當您捕獲JsonSyntaxException後,您可以處理它或將其重新拋出爲檢查異常。

例:

try{ 
    //do whatever 
}catch(JsonSyntaxException e){ 
    e.printStackTrace(); 
    // throw new Exception(e); //checked exception 
}catch(IOException e){ 
    e.printStackTrace(); 
} 
+0

這是在客戶端代碼?如果是這樣,客戶端如何知道可能拋出JsonSyntaxException異常? – CodeBlue 2012-02-26 18:16:00

+0

@CodeBlue這可能在客戶端代碼中(他們會知道它可能被拋出,因爲你的API可能指定它可能被拋出),或者它可能在你的getPost方法中。如果它在你的'getPost'方法中,你將不會捕獲'IOException',那麼你可以像檢查異常一樣傳遞'JsonSyntaxException'。 – Jeffrey 2012-02-26 18:19:49

+0

好的。感謝您的澄清。 – CodeBlue 2012-02-26 18:21:07