2011-09-28 13 views
10

Primero motivaré rápidamente la pregunta con mi caso de uso. Mi biblioteca necesita exponer un clasificador de excepciones de Java a un marco en el que se conecta. Por ejemplo:Ciclos en excepciones encadenadas

enum Classification { FATAL, TRANSIENT, UNKNOWN } 

Classification classify(Throwable t) { 
    if (t instanceof MyTransientException) 
     return Classification.TRANSIENT; 
    else if (t instanceof MyFatalException) 
     return Classification.FATAL; 
    else 
     return Classification.UNKNOWN; 
} 

veces, y por razones fuera de mi control, a excepción pasado es una envoltura alrededor de la que yo estoy interesado en lo que desea buscar en la cadena de causa para ello. Mi idea inicial era:

Classification classify(Throwable t) { 
    if (t == null) 
     return Classification.UNKNOWN; 

    if (t instanceof MyTransientException) 
     return Classification.TRANSIENT; 
    else if (t instanceof MyFatalException) 
     return Classification.FATAL; 
    else 
     return classify(t.getCause()); 
} 

Desafortunadamente, esto podría dar lugar a la repetición infinita si la excepción pasado tiene un ciclo en su cadena causal. Es muy poco probable que se apruebe una excepción de este tipo, y se podría argumentar que es un error en otro lugar del sistema si se crea una excepción, pero me siento muy incómodo con la posibilidad de que mi biblioteca sea responsable de una producción interrupción si sucede. La API y javadoc de Throwable no prohíben explícitamente esta posibilidad más allá de la idea de que los ciclos son inherentemente absurdos en una cadena causal.

Noté que la guayaba tiene un método @Beta para extraer la cadena causal, Throwables.getCausalChain, pero su implementación es susceptible al mismo problema: terminará arrojando un OOME.

Estoy planeando utilizar un identity hash set para detectar el ciclo y mitigar el riesgo, pero quería escuchar cómo otros ven este problema. ¿Crees que estoy siendo demasiado defensivo? ¿Qué harías?

Respuesta

13

Es genial que estés siendo tan concienzudo. Pero no quiere entrar en el negocio de la fabricación de botas kevlar.

Si un usuario hace algo que haría que incluso Throwable.printStackTrace entre en recurrencia infinita, ese usuario está más allá de la ayuda. Ni siquiera te preocupes por esto.

Cuestiones relacionadas