2012-02-26 12 views
6

Estoy escribiendo una biblioteca que se ajusta a una API REST. El contenedor que estoy creando usa GSON para deserializar el json en mi objeto. Básicamente, algo como esto ...Cómo manejar adecuadamente excepciones importantes sin marcar

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. 
} 

Si entiendo correctamente, IOException es una excepción marcada. Le digo a mi cliente: Oye, amigo, es mejor que tengas cuidado y te recuperes de esta excepción. Ahora mi cliente puede ajustar la llamada en un try/catch y determinar qué hacer si hay alguna falla en la red.

El método GSON fromJson() arroja una JsonSyntaxException. Creo que esto no se controla en el mundo de Java, ya que una de sus superclases es RuntimeException, y también porque no estoy obligado a agregar un try/catch u otro "throws" como IOException.

Asumiendo que lo que he dicho hasta ahora es correcto, ¿cómo deberían manejar la API y el cliente esta situación? Si la cadena json es basura, mi cliente va a fallar miserablemente debido a la excepción JsonSyntaxException porque está desmarcada.

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

¿Cuál es la mejor manera de manejar estas situaciones?

Respuesta

6

Puede capturar excepciones sin marcar. Simplemente agregue catch(JsonSyntaxException e) a su bloque try-catch. Después de tomar el JsonSyntaxException, puede manejarlo o volver a lanzarlo como una excepción marcada.

Ex:

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

¿Es esto en el código de cliente? Si es así, ¿cómo puede saber el cliente que se puede lanzar una JsonSyntaxException? – CodeBlue

+0

@CodeBlue Esto podría estar en el código del cliente (ellos sabrían que podría ser lanzado porque su API podría especificar que podría ser lanzado) o podría estar en su método 'getPost'. Si está en su método 'getPost', usted no captaría' IOException', pasaría la 'JsonSyntaxException' junto con una excepción marcada. – Jeffrey

+0

Ok. Gracias por la aclaración. – CodeBlue

Cuestiones relacionadas