square/moshi

`JsonAdapter.fromJson` functions are documented as throwing `IOException` but actually throw `JsonDataException`

Orbar opened this issue · 1 comments

JsonAdapter.fromJson function are annotated with @Throws(IOException::class) indicating that is the exception that they will throw when there is an error when deserializing a json string, however what is actually thrown is a JsonDataException which is a RuntimeException meaning that if you try to catch the document IOException, your error handling code will be skipped.

For example, consider the following code

@JsonClass(generateAdapter = true)
data class MyType(@Json(name = "one") override val param: String)

...

try {
  myTypeAdapter.fromJson("{}") // just an empty json
catch (e: IOException) {
  // exception will not be caught
}

JsonDataException should extend IOException, or JsonAdapter.fromJson should be updated to indicate that they throw JsonDataException

The exception list is not exhaustive. IOException is declared because it is a checked exception for Java callers.