2012-02-26 11 views
6

私はREST APIをラップするライブラリを作成しています。私が作成しているラッパーは、GSONを使用してjsonをデシリアライズしてオブジェクトにします。基本的には、このようなものです...重要で未チェックの例外を正しく処理する方法

私が正しく理解すれば、IOExceptionはチェック例外です。私はクライアントに言っています:ねえ、おまえ - あなたはこの例外から気をつけて回復するほうがいい。これで私のクライアントはtry/catchで呼び出しをラップし、何らかのネットワーク障害が発生した場合の対処方法を決定できます。

GSONのfromJson()メソッドは、JsonSyntaxExceptionをスローします。スーパークラスの1つがRuntimeExceptionであり、try/catchやIOExceptionのような別の "throws"を追加する必要がないため、これはJavaの世界では未チェックと考えられます。

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

未チェックの例外をキャッチすることは許可されています。あなたのtry-catchブロックにcatch(JsonSyntaxException e)を追加するだけです。 JsonSyntaxExceptionを捕まえたら、それを処理するか、チェック例外として再スローすることができます。

例:

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

は、クライアントコードでこれですか?その場合、クライアントはJsonSyntaxExceptionがスローされる可能性があることをどのように知ることができますか? – CodeBlue

+0

@CodeBlueこれは、クライアントコード内にある可能性があります(APIがスローする可能性があると指定できるため、スローされる可能性があります)。または、getPostメソッドにある可能性があります。 'getPost'メソッドの中に' IOException'をキャッチしない場合は、チェックされた例外として 'JsonSyntaxException'を渡します。 – Jeffrey

+0

説明をありがとう。 – CodeBlue