17

ジャクソンの ObjectMapper#readValueメンバーは、3つのチェックされた例外をスローします。

IOException 
JsonParseException 
JsonMappingException

JsonParseExceptionJsonMappingException拡張しIOExceptionます。前述の2つの子クラスをラップして、独自のカスタム例外をスローしたいのですが、IOExceptionチェックされている基本クラスでは、それもキャッチまたはスローする必要があります。

呼び出し層まで投げるのは意味がありませんIOExceptionが、逆に隠してしまうと匂いがします。私の当初の考えは、それをキャッチせず、それを処理するために呼び出し元/実行時例外メカニズムに任せることでした...それでも、呼び出し元にキャッチまたは指定を強制する必要はありません。

そのような状況で何をしますか?

4

4 に答える 4

15

簡単な答え:IOを扱う場合は、IOExceptionsを扱います。IOを処理しない場合、IOExceptionsはバグのあるコードの症状であるため、チェックされていない例外に変換する必要があります。


長い答え:

readValue常にを取りますJsonParser。これはIO(ファイルやURLなど)にラップされる場合があります。IOを扱っている場合、IOExceptionsを扱う方法はありません。それらを処理するか、何らかの方法でそれらを再スロー/パスする必要があります。IO中には何でも発生する可能性があるため、例外に対処する準備をしておく必要があります。

ただし、インスタンスがIOを使用していないことが確実な場合JsonParser(たとえば、文字列にJSONパーサーを作成するために使用した場合)、受け取ったものはコードまたはJacksonのいずれかでバグでJsonFactory#createJsonParser(java.lang.String)あると見なすことができます。IOException通常、チェックされていない例外をスローすることが、それを処理する適切な方法です。

ObjectMapper om = new ObjectMapper(/* whatever */);
JsonParser jp = JsonFactory.createJsonParser("{ \"foo\": \"bar\" }");
try {
    return om.readValue(jp);
} catch (IOException e) {
    throw new AssertionError("An IOException occurred when this was assumed to be impossible.");
}

注意:私のJavaは錆びており、Jacksonを使用したことがないので、上記のブロックを擬似コードと見なしてください。

いずれの場合も、チェックされていない例外であるため、で宣言AssertionErrorする必要はありません。throwsサブクラスであるjava.lang.RuntimeExceptionか、java.lang.Error明示的にキャッチまたは再スローする必要がないものすべて。これらの例外は、バグのあるコードを処理している場合、またはVMのホストが起動している場合を除いて、発生することが予想されない問題に使用されます。

于 2011-09-19T13:26:08.080 に答える
2

これはJackson内で明確に文書化されていませんが、IOExceptionsの理論的根拠は単純です。入力ソース(および出力ターゲット)からのIOExceptionはそのままスローされます。Jackson自体はこれらに対して何もできないため、そのままスローされます。IOExceptionの唯一の追加ソースは、概念的には低レベル(データ形式に依存しない)I / O処理の一部であり、具体的には、UTF-8のような文字エンコードのデコードです。

このことから、JsonParsingExceptionは、無効なコンテンツの解析に関連する問題に対するものであることが比較的直感的に思えます。データバインディングレベルでの問題については、JsonMappingException。a

于 2011-09-20T16:42:45.020 に答える
1

IOExceptionjson例外を処理してラップするのと同じ方法で処理する必要があります。ジャクソンのドキュメントがあまりにも不足しているので、とにかくそれらのいずれかがスローされる理由は本当にわかりません(「不明なエラー」を除く)。

于 2011-09-19T13:00:35.667 に答える
0

ボイラープレートコードをtry/catch / rethrowでメソッドを数十回ラップしているときに、忍耐力が枯渇する可能性があります。そして、ロンボクが私のためにそれを処理できることがわかりました。それがhttps://projectlombok.org/features/SneakyThrowsに役立つことを願ってい ます

于 2021-06-14T13:43:33.220 に答える