2009-05-08 17 views
16

Ho lanciato ServletException s in passato, quando qualcosa/qualcosa non funziona in un servlet, principalmente avvolgendo l'eccezione in ServletException.Quando è corretto lanciare un ServletException da un servlet?

Ora sto pensando che in realtà è meglio non lanciare un ServletException ma rispondere con response.sendError(sc) e utilizzare i codici di stato HTTP corretti.

Se non posso inviare un errore utilizzando reponse.sendError, (IOException), ho avvolgere il IOException in un ServletException.

È il modo migliore per rispondere? Quando è giusto lanciare un ServletException?

risposta

21

Sono appena giunto alla conclusione opposta a @alamar. La mia situazione è scrivere un servlet in stile REST da chiamare per codice in un database Oracle, non da umani.

Desidero restituire il codice HTTP 400 Richiesta errata al chiamante quando le informazioni sulla richiesta non sono valide o mancanti. Lanciando un ServletException il contenitore restituisce Errore interno server 500, che indica che c'è qualcosa che non va nel server, non nella richiesta.

Ecco la soluzione che ho adottato.

  1. Creare una classe di eccezione semplice RequestException che si estende Exception.
  2. Verificare la validità della richiesta con i metodi che generano new RequestException(message).
  3. Cattura RequestException nel metodo del servlet doPost e chiamare HttpServletResponse.sendError() come questo:

    try { 
        validateRequest(request); 
        // Do stuff with a valid request. 
    } catch (RequestException e) { 
        response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage()); 
    } 
    

Il messaggio viene restituito al chiamante come sarebbe con un ServletException.

+1

Quale errore HTTP restituisce "IOException'? – ADTC

+3

@ADTC Un rapido esperimento mostra che Tomcat 7 genera _500 Errore interno server_ per una 'IOException', come per' ServletException'. Non so se questo comportamento è per specifica o per convenzione. – pharsicle

8

È meglio lanciare un ServletException.

È possibile in seguito rilevare questa eccezione con la direttiva error-page nel proprio web.xml e compiere le azioni appropriate: visualizzare una pagina di errore di fantasia per l'utente, inviare l'eccezione insieme allo stack trace agli sviluppatori, scriverlo nei registri e così via sopra.

Se si utilizza solo sendError(), non è possibile farlo, in varie estensioni.

+0

In realtà ho dimenticato che in passato ho fatto la stessa cosa nei siti web. Al momento sto usando un servlet per creare un semplice servizio Web XML, quindi in quel contesto non c'è nessuna pagina da mostrare. Grazie del promemoria! –

+1

@alamar, descriveresti il ​​tuo approccio? Magari postare del codice? Sono particolarmente curioso con il bit che indirizza lo stacktrace e scrive nel log. – craig

+0

@craig dovresti cercare [error-page web.xml] su – alamar

Problemi correlati