2010-10-27 12 views
19

Per le cose ciclo di vita del servlet, che cosa fate voi ragazzi consiglio di fare in risposta ad un'eccezione ...modo migliore per gestire le eccezioni Java in ServletContextListener

Per esempio,

public class Foo implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     try { 
      // something nasty 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     try { 
      // something nasty 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

io non sono del tutto sicuro cosa gestirà l'eccezione di runtime sopra. Sto lavorando sull'idea che, se vengono lanciate eccezioni, sono abbastanza seri da rompere completamente il sistema in modo che un'eccezione di runtime (non gestita) possa essere corretta..

immagino che sto chiedendo che cosa si occupa incontrollati eccezioni contesto servlet ascoltatori?

risposta

10

Quando si cattura un'eccezione, si potrebbe prendere in considerazione l'impostazione di un attributo ServletContext per indicare che è stato rilevato un errore. In questo modo, se il contenitore non ha disattivato l'app, è possibile avere Filter s e/o Servlet s ispezionare l'attributo ServletContext e prendere l'azione appropriata, come visualizzare una pagina di errore.

+3

3.0.1 Glassfish rifiuta di distribuire un applicazione Web, se ServletContextListener.contextInitialized genera una RuntimeException. Tuttavia, se l'applicazione è già stata distribuita e viene lanciata una RuntimeException al riavvio del server, GF 3.0.1 rifiuta di avviarsi (il che rende impossibile annullare la distribuzione utilizzando gli strumenti forniti). In questo caso abbiamo optato per impostare un attributo ServletContext nel listener e generare un messaggio di errore in un filtro. – Vetle

0

E 'un buon tono di mostrare qualche pagina come "Errore tecnico, mi dispiace", e di non mostrare lo StackTrace con il messaggio di errore. Basta registrarlo e inoltrare l'utente alla pagina di errore.

+3

I metodi nel listener del contesto servlet non verranno eseguiti su una richiesta HTTP ma all'avvio del contesto, quindi non c'è modo di mostrare una pagina di errore. –

6

Sembra che ServletContentListener non è progettato per essere in grado di esercitare il controllo del ciclo di vita (altrimenti sarebbe permesso di gettare un ServletException).

Come tale, non fare affidamento su una RuntimeException per fare qualcosa di utile. Guardando a some other threads here, sembra essere registrato e ignorato su alcuni server delle applicazioni.

Se è fondamentale che l'applicazione non si avvia quando il codice non riesce, è necessario spostare il codice in sezione di inizializzazione di una Servlet.

+1

Servlet specifiche dice che il server di applicazione "può" interrompere l'avvio dell'applicazione: http://stackoverflow.com/questions/272194/abort-java-webapp-on-startup/272747#272747 – Thilo

-2

Possiamo eseguire l'eccezione tramite object.printStackTrace(); o chiamando l'eccezione tramite out.print ("Eccezione è" + ex);

+2

Questo è solo per le normali alfazioni, non esiste uno standard input o output in un'applicazione web. – Coyote21

Problemi correlati