¿Cómo puedo detectar todas las excepciones que se generarán al leer y escribir un archivo?

105

En Java, ¿hay alguna forma de obtener (capturar) todo en exceptionslugar de capturar la excepción individualmente?

Johanna
fuente
2
y capturaré todas esas Excepciones específicas con la captura (Excepción e) {} ??
Johanna
Si. Dado que Exception es la clase base de todas las excepciones, detectará cualquier excepción.
jjnguy
1
@ jjnguy: gracias por tu buena explicación.
Johanna
Me alegro de que haya sido útil.
jjnguy

Respuestas:

111

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

El código se ve así:

public void someMethode() throws SomeCheckedException {

    //  code

}

Luego, más tarde puedes lidiar con el exceptions si no quieres lidiar con ellos en ese método.

Para detectar todas las excepciones, puede que algún bloque de código arroje lo siguiente: (Esto también detectará Exceptionsque escribió usted mismo)

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 Exceptiones la clase base para todas las excepciones. Por lo tanto, cualquier excepción que pueda arrojarse es una Exception('E' mayúscula).

Si desea manejar sus propias excepciones primero, simplemente agregue un catchbloque antes de la excepción genérica.

try{    
}catch(MyOwnException me){
}catch(Exception e){
}
jjnguy
fuente
95

Si bien estoy de acuerdo que no es un buen estilo detectar 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 lanzar 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;
    }
}
Codethulhu
fuente
12
¿Por qué no utilizar varios bloques de captura?
Carl G
1
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.
codethulhu
Ese lanzador fue útil.
Anshul
Esta es la solución que estaba buscando, necesitaba un si más para el manejo de excepciones. Gracias
CubeJockey
La punta desechable es realmente útil.
cherryhitech
15

Captura la excepción base 'Exception'

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }
Alano
fuente
8
Si escribe este código, es casi seguro que está haciendo algo terriblemente mal.
George
2
@George ¿Por qué dijiste eso?
Kuchi
10
@George No necesariamente, si se trata de algo que tiene muchos parámetros de entrada sensibles y es muy complicado verificar la validez de cada uno de ellos, la captura de todo tipo de excepciones una vez que los casos de trabajo se prueban adecuadamente es el camino a seguir. . Hará que el código sea claro y mucho menos f * k que una condición enorme y potencialmente pesada.
Johnride
2
La mayoría de los programadores con los que he trabajado no ponen nada en sus declaraciones de captura, por lo que usar este fragmento de captura de prueba es en realidad mejor que detectar un montón de tipos de excepciones diferentes y no hacer nada con él
Lou Morda
1
@LouisMorda No estoy de acuerdo, detectar cada subclase de excepción y no hacer nada basado en ellas (ignorarlas) es peor que solo detectar algunas excepciones específicas e ignorarlas. Si detecta algunos tipos de excepción y no hace nada con la información, no tiene ninguna posibilidad de saber qué salió mal en esas situaciones, pero si detecta todas las subclases de excepción, no tiene ninguna 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 los seguimientos de pila y los mensajes.
zpon
6

Es una mala práctica detectar la excepción : es demasiado amplia y puede perder algo como una NullPointerException en su propio código.

Para la mayoría de las operaciones de archivos, IOException es la excepción raíz. Mejor captar eso, en cambio.

Alex Feinman
fuente
1
Es una mala práctica detectar la excepción. ¿por qué? voto negativo mal explicado
Pedro Sequeira
4

Sí hay.

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

Puede detectar múltiples excepciones en un solo bloque de captura.

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

¿Te refieres a atrapar un Exceptionde cualquier tipo? que se lanza, en lugar de solo Excepciones específicas?

Si es así:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}
Josh Jordan
fuente
¿Qué debo hacer por los que no son específicos?
Johanna
y capturaré todas esas Excepciones específicas con la captura (Excepción e) {} ??
Johanna