2010-04-22 35 views
7

Tengo un módulo de complemento que va a una aplicación web. Si el módulo no se carga correctamente, no tiene sentido que la aplicación web continúe y la aplicación web probablemente no se cargue en absoluto, preferimos que este módulo se inicialice correctamente siempre. Si lanzo una excepción de tiempo de ejecución, entraría en los registros, y simplemente me ignorarán, ya que la aplicación continuará de todos modos, y los usuarios finales nunca sabrán ... Sé que los errores deben arrojarse solo bajo condiciones excepcionales, y generalmente tienen que ver con situaciones de las que el sistema no puede recuperarse, pero ¿qué harías en tal situación?¿Está bien lanzar un java.lang.Error?

+0

no debe ser un error, pero algunos subclase apropiada, ya sea existente o uno que defina. Pero lanzar una subclase de Error es apropiado en su situación. –

Respuesta

4

El soloError que he utilizado regularmente en el código comercial es ExceptionInInitializerError. No tiene otra opción en los bloques de inicializador static.

Pero incluso si lo lanza dentro de una aplicación web, la aplicación weba continuaría escuchando solicitudes HTTP. Su mejor opción es hacer la carga o inicialización del módulo dentro de un Filter escuchando en un url-pattern de /* y dejar que el Filter bloquee las solicitudes HTTP en consecuencia. P.ej.

private boolean allModulesAreLoaded; 

@Override 
public void init(FilterConfig config) { 
    try { 
     // Load modules. 
     allModulesAreLoaded = true; 
    } catch (Exception e) { 
     // Handle. 
    } 
} 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { 
    if (allModulesAreLoaded) { 
     chain.doFilter(request, response); 
    } else { 
     throw new ServletException("Not all modules are loaded."); 
    } 
} 

Esto produciría un error HTTP 500 con el mensaje dado.

1

No estoy seguro de cómo exactamente, pero OSGi obtuvo una administración de la dependencia de los paquetes (= similar a los complementos). Un paquete no se carga hasta que otro paquete esté listo. Tal vez puedas usar este mismo mecanismo (o simplemente usar OSGi mismo;)) para esperar un plugin/aplicación hasta que otro plugin esté listo. O apaga la aplicación durante el inicio si no puede encontrar/cargar su complemento correctamente.

+0

Parece que el martillo de todos los clavos, sin embargo, siendo aficionado a OSGi, tiendo a aprobar. Además, cualquier tipo de mecanismo de administración de dependencias debería funcionar (IoC, lo que sea). – Riduidel

-1

registrar el error, y luego usar System.exit a poco salir de la aplicación

+0

No proporciona ninguna indicación (más allá del código de retorno) de por qué falló la aplicación. –

+0

@HotLicks Agregué una sugerencia para registrar primero el error y luego salir. – Demi

Cuestiones relacionadas