Posso lanciare un'eccezione con JSTL in un tag JSP personalizzato quando un attributo non è valido?
-
27-10-2019 - |
Domanda
Sto facendo un tag JSP. Passo un parametro di tipo al tag.
Il codice sembra questo:
<%@ attribute name="type" require="true" %>
<c:choose>
<c:when test="${type eq 'even'}">
<c:set var="remainder" value="0" />
</c:when>
<c:when test="${type eq 'odd'}">
<c:set var="remainder" value="1" />
</c:when>
<c:otherwise>
<%-- Want to throw exception!! --%>
</c:otherwise>
</c:choose>
Voglio lanciare un'eccezione se passo un valore sbagliato. Quando ho cercato su questo argomento ho appena trovato questo. Non posso lanciare una normale eccezione in JSTL?
Soluzione
Basta lanciare per notare il problema immediatamente
Chi noterebbe "notare"? Tale eccezione può essere catturata solo dal contenitore e si tradurrà in una pagina "Errore del server interno" 500 "o una pagina di errore personalizzata che definisce).
Se questo è quello che vuoi veramente, puoi definire un tag personalizzato che eseguirà semplicemente "Throw New qualunque Exception ()", quindi utilizza il tuo taglib personalizzato come: <mytaglib:reportError/>
, poiché il core standard Taglib non ha preso in considerazione l'idea di lanciare un'eccezione sarebbe mai desiderabile per nessuno.
Altri suggerimenti
Ho deciso di rilanciare e modificare una risposta cancellata che sembrava parzialmente corretto.
Puoi lanciare un'eccezione aggiungendola in una sceneggiatura come così:
<c:choose> <c:when test="${type eq 'even'}"> <c:set var="remainder" value="0" /> </c:when> <c:when test="${type eq 'odd'}"> <c:set var="remainder" value="1" /> </c:when> <c:otherwise> <% if (true) throw new Exception("Wrong type"); %> </c:otherwise> </c:choose>
Tuttavia, i tuoi JSP dovrebbero far parte del tuo livello "vista", quindi dovresti davvero provare a mantenere la tua logica (incluso il lancio dell'eccezione) nei tuoi servizi.
Notare la if (true)
dichiarazione. È un trucco perché il compilatore si lamenterà del "codice irraggiungibile" se si lascia semplicemente cadere la scriptlet di eccezione nel tuo codice.
Userei solo una funzione o tag personalizzata che lancia sistematicamente un'eccezione o visualizza un grande div rosso con il messaggio di errore o entrambi
${myFn:illegalState("the type must be odd or even but it is " ${type})}