2010-07-29 7 views
5

¿Es posible que un objeto Exception genere otra excepción debido a su error interno?¿Es posible que un objeto Exception genere otra excepción debido a su error interno?

Supongamos que en try-catch instanciamos el objeto Exception, ¿es posible que la creación de instancias genere otra excepción? Si es así, debemos anidar bloques infinitamente try-catch que parecen tan divertidos.

+0

Podría aclarar su pregunta. ¿Es cuando la excepción se actualiza/crea? ¿Está en el bloque catch? –

+0

Consulte mi modificación anterior. Gracias. – xport

+1

Sin tener en cuenta. No todas las excepciones pueden y deben ser manejadas. Algunos son indicaciones de errores o lógica incorrecta. –

Respuesta

3

En resumen, la respuesta es sí, es posible.

Por ejemplo, si la clase de excepción requiere que un objeto grande se inicialice como un campo, pero no hay suficiente memoria para asignarlo, obtendrá un objeto de excepción que arrojaría un OutOfMemoryException.

Las excepciones son como cualquier otra clase y pueden arrojar excepciones en sí mismas. No hay nada en el lenguaje que lo desautorice.

Yo diría, sin embargo, que lanzar excepciones de una clase de excepción es una mala práctica y en general debería evitarse.


Actualización: (siguiente pregunta actualizada)

Si va a crear instancias de un objeto de excepción en un bloque try, la catch lo cogerá (suponiendo que atrapa el tipo apropiado de excepción). Si está instanciando en el bloque catch, puede hacer eso en un try{}catch{} anidado - esto es bastante normal para el código utilizado en un bloque catch que puede generar excepciones.

Como han dicho otros, algunas excepciones no deben ser detectadas (por ejemplo, OutOfMemory o inesperado StackOverflow), ya que no tiene una forma de manejarlas.

+0

¿En qué caso es posible? – xport

+0

@xport - Di un ejemplo. En cualquier caso, usted mismo puede escribir una clase de excepción y en ella 'lanzar' una excepción. Las excepciones son simplemente clases y obedecen todas las reglas de la clase. – Oded

2

Sí, ciertamente es posible que una excepción en sí misma genere una excepción.

Sin embargo, más (no todas) de las excepciones de marco son cosas bastante livianas con muy poca lógica interna, por lo que la excepción promedio probablemente no tiene mucho alcance para generar excepciones.

¿Es esta una excepción de marco con la que está viendo este comportamiento? ¿Puedes darnos algunos detalles?

Un vistazo rápido a las partes internas de la excepción con una herramienta como Reflector puede ayudarlo a detectar qué ocurre, si es que ocurre algo.

1

. Esto es posible.

Pero me pregunto por qué alguna vez querría hacer esto? Las excepciones son solo para comunicar los errores, de modo que, prácticamente por diseño, no pueden tener ningún código serio o lógica ejecutándose dentro de ellos que pueda causar una excepción. Si su argumento es, es posible que desee registrar la excepción en la base de datos o el disco que podría causar una excepción en algunas condiciones, entonces ni siquiera estaría de acuerdo con eso ya que la excepción debe registrarse en el bloque catch.

2

Sí, es posible aunque no muy típico. Si la excepción arrojada tiene un error en el constructor o depende de clases faltantes, entonces arroja una excepción.

Es fácil probar esto: cree su propia excepción que intente llamar a un método una referencia nula. Cuando crea una instancia de la excepción, lanzará una NullReferenceException.

1

Si está pensando que el objeto de excepción debería intentar manejar la situación y lanzar otra excepción, si no fuera así, sería incorrecto.
El bloque catch debe manejar la situación incorrecta y arrojar la excepción más lejos si no puede hacerlo.
Ejemplo:

try 
{ 
    BigResource r = new BigResource(); 
} 
catch(BigResourceException e) 
{ 
    bool cannotHandle = false; 
    // Handle exception here 

    if (cannotHandle) 
     throw e; 
} 
Cuestiones relacionadas