¿Cómo puedo detectar todas las excepciones lanzadas al leer/escribir un archivo?

6 minutos de lectura

Avatar de usuario de Johanna
Juana

En Java, ¿hay alguna forma de obtener (atrapar) todos exceptions en lugar de capturar las excepciones individualmente?

  • y atraparé todas esas Excepciones específicas con catch(Exception e){}??

    – Juana

    2 de julio de 2009 a las 18:21

  • sí. Dado que Exception es la clase base de todas las excepciones, detectará cualquier excepción.

    – jjnguy

    2 de julio de 2009 a las 18:23

avatar de usuario de jjnguy
jjnguy

Si lo desea, puede agregar cláusulas throws a sus métodos. Entonces no tiene que capturar los métodos marcados de inmediato. De esa manera, puedes atrapar el exceptions más tarde (quizás al mismo tiempo que otros exceptions).

El código se parece a:

public void someMethode() throws SomeCheckedException {

    //  code

}

Luego, más tarde, puede lidiar con el exceptions si no quieres tratar con ellos de esa manera.

Para capturar todas las excepciones que algún bloque de código puede arrojar, puede hacer lo siguiente: (Esto también capturará Exceptions tu mismo escribiste)

try {

    // exceptional block of code ...

    // ...

} catch (Exception e){

    // Deal with e as you please.
    //e may be any type of exception at all.

}

La razón por la que funciona es porque Exception es la clase base para todas las excepciones. Por lo tanto, cualquier excepción que pueda ser lanzada es una Exception (‘E’ mayúscula).

Si desea manejar sus propias excepciones primero simplemente agregue un catch bloque antes de la Excepción genérica uno.

try{    
}catch(MyOwnException me){
}catch(Exception e){
}

Si bien estoy de acuerdo en que no es un buen estilo capturar una excepción sin procesar, hay formas de manejar las excepciones que brindan un registro superior y la capacidad de manejar lo inesperado. Dado que se encuentra en un estado excepcional, probablemente esté más interesado en obtener buena información que en el tiempo de respuesta, por lo que la instancia de rendimiento no debería ser un gran éxito.

try{
    // IO code
} catch (Exception e){
    if(e instanceof IOException){
        // handle this exception type
    } else if (e instanceof AnotherExceptionType){
        //handle this one
    } else {
        // We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
        throw e;
    }
}

Sin embargo, esto no tiene en cuenta el hecho de que IO también puede generar errores. Los errores no son excepciones. Los errores están bajo una jerarquía de herencia diferente a las excepciones, aunque ambos comparten la clase base Throwable. Dado que IO puede arrojar errores, es posible que desee ir tan lejos como para atrapar Throwable

try{
    // IO code
} catch (Throwable t){
    if(t instanceof Exception){
        if(t instanceof IOException){
            // handle this exception type
        } else if (t instanceof AnotherExceptionType){
            //handle this one
        } else {
            // We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else if (t instanceof Error){
        if(t instanceof IOError){
            // handle this Error
        } else if (t instanceof AnotherError){
            //handle different Error
        } else {
            // We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else {
        // This should never be reached, unless you have subclassed Throwable for your own purposes.
        throw t;
    }
}

  • Yo diría que debería capturar cada excepción explícitamente, pero la pregunta preguntaba explícitamente cómo capturar todo lo que arrojaría un bloque de código.

    – códigothulhu

    17 de febrero de 2014 a las 16:15

  • Ese arrojadizo fue útil.

    – Anshul

    21 de mayo de 2014 a las 7:21

  • Esta es la solución que estaba buscando, necesitaba un if else para el manejo de excepciones. Gracias

    – CubeJockey

    23 de julio de 2015 a las 14:49

  • La punta desechable es realmente útil.

    – cherryhitech

    16 de junio de 2017 a las 20:51

  • Si detecta Throwables, debe tener en cuenta que VirtualMachineErrors, como StackOverflowError o OutOfMemoryError, no le permite hacer mucho más que iniciar sesión. Están fuera del control de las aplicaciones y no puedes manejarlas.

    – Datz

    16 de abril de 2019 a las 5:28

Atrapa la excepción base ‘Excepción’

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }

  • Si escribe este código, es casi seguro que está haciendo algo terriblemente mal.

    – Jorge

    2 de mayo de 2013 a las 3:40

  • @George ¿Por qué dijiste eso?

    – kuchi

    20 de junio de 2013 a las 17:24

  • @George No necesariamente, si se trata de algo que tiene muchos parámetros de entrada confidenciales y es muy complicado verificar la validez de cada uno de ellos, el camino a seguir es detectar todo tipo de excepciones una vez que los casos de trabajo se prueban adecuadamente. . Hará que el código sea claro y mucho menos molesto que una condición enorme y potencialmente pesada.

    – Johnride

    15 de noviembre de 2013 a las 18:53

  • La mayoría de los codificadores con los que he trabajado no ponen nada en sus declaraciones de captura, por lo que usar este fragmento de captura de prueba es mejor que capturar un montón de diferentes tipos de excepción y no hacer nada con eso.

    – Lou Morda

    06/04/2015 a las 23:56


  • @LouisMorda No estoy de acuerdo, capturar todas las subclases de Excepción y no hacer nada basado en ellas (ignorándolas) es peor que solo capturar algunas excepciones específicas e ignorarlas. Si detecta algunos tipos de Excepción y no hace nada con la información, no tiene posibilidad de saber qué salió mal en esas situaciones, pero si detecta todas las subclases de Excepción, no tiene posibilidad de saber qué salió mal en un número mucho mayor. de situaciones Considere cómo manejaría los informes de errores sin la información de las excepciones, como seguimientos de pila y mensajes.

    – zpon

    29 de julio de 2015 a las 12:29

Puede capturar varias excepciones en un solo bloque de captura.

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
} 

Es una mala práctica atrapar Excepción — es demasiado amplio, y es posible que se pierda algo como un Excepción de puntero nulo en su propio código.

Para la mayoría de las operaciones con archivos, IOException es la excepción raíz. Mejor atrapar eso, en su lugar.

  • Es una mala práctica capturar Exception. ¿por qué? voto negativo mal explicado

    – Pedro Sequeira

    22 de marzo de 2018 a las 17:38

Avatar de usuario de Marv
marv

¿Quieres decir atrapar un Exception de cualquier tipo que se lanza, en lugar de solo excepciones específicas?

En ese caso:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}

  • Es una mala práctica capturar Exception. ¿por qué? voto negativo mal explicado

    – Pedro Sequeira

    22 de marzo de 2018 a las 17:38

Avatar de usuario de CodeFusionMobile
CodeFusionMóvil

Sí hay.

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}

¿Ha sido útil esta solución?