Saltar al contenido

HttpURLConnection.getResponseCode() lanza IOException cuando se conoce el código

Al fin luego de tanto trabajar ya hallamos el arreglo de este conflicto que ciertos lectores de este sitio han presentado. Si quieres compartir algo más no dudes en compartir tu conocimiento.

ATENCIÓN: ¡esto puede depender de la versión de JVM que esté ejecutando! como pruebas de @SotiriosDelimanolis dieron resultados diferentes

La respuesta está en el código fuente de HttpURLConnection y está relacionada con todos los errores que tienen código de error > 400

Si el código de error es igual a 404 o 410, se lanza una excepción FileNotFoundException; de lo contrario, una IOException como

    if (respCode >= 400)  respCode == 410) 
            throw new FileNotFoundException(url.toString());
         else 
            throw new java.io.IOException("Server returned HTTP" +
              " response code: " + respCode + " for URL: " +
              url.toString());
        
    

sun.net.www.protocol.http.HttpURLConnection Código fuente en la línea 1625:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/net/www/protocol/http/HttpURLConnection.java#HttpURLConnection

Mi prueba en http://media.jarnbjo.de/412.php usando:

Java(TM) SE Runtime Environment (compilación 1.7.0_21-b11) Java HotSpot(TM) Servidor virtual de 64 bits (compilación 23.21-b01, mixed modo)

en Windows de 64 bits

ingrese la descripción de la imagen aquí

Encontré el mismo problema hoy en el trabajo: nuestro código estaba llamando HttpURLConnection.getResponseCode() y terminando con Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: ... — y después de un tiempo de calidad buceando a través del código fuente de JDK, terminé descifrando lo siguiente:

  • getResponseCode()no es en realidad lanzando una excepción!
  • Se lanza una excepción desde muy adentro getResponseCode()pero se atrapa.
    • Antes de que se atrape, algunos campos se establecen dentro HttpURLConnection eso permite getResponseCode() para tener éxito, lo que hace.
    • Además, antes de que se detecte, la excepción se guarda en un campo en una subclase de HttpURLConnection (específicamente: sun.net.www.protocol.http.HttpURLConnection.rememberedException).
  • Posteriormente, nuestro código llamado getInputStream() directamente, que es supuesto para lanzar una excepción en este caso. (Se supone que debes llamar getErrorStream() en lugar de.)
  • getInputStream() lanza una excepción que envuelve la excepción original lanzada y atrapada.
  • Así que terminamos obteniendo un stacktrace con Caused by-s que se refería a nuestra línea de código donde estábamos llamando getResponseCode()a pesar de que nuestro problema real fue posterior, en nuestra línea de código donde estábamos llamando getInputStream() directamente.
    • el seguimiento de la pila además menciona esa línea de código posterior, pero no me di cuenta de eso al principio.

Apuesto a que tu caso fue el mismo.

Si sostienes alguna desconfianza y capacidad de avanzar nuestro escrito te insinuamos ejecutar una disquisición y con placer lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *