J'ai le scénario suivant dans mes urlmapings.groovy: et j'ai besoin de savoir sur la contrainte d'erreur à partir duquel contrôleur a été lancé l'exception (le cas échéant) qui soulève l'erreur 500, et montrer des pages d'erreur différentes pour les utilisateurs et l'administrateur. P> Des idées? p> Merci d'avance. p> p>
5 Réponses :
Utilisation de update strong> p> Le truc est que les grevers enveloppent l'exception lancée dans un GrailsfraupsRuntimeException Fournir un accès confortable à le code étant responsable de l'exception. Utilisez le snippet suivant dans votre contrôleur d'erreur: P> request.getattribute ("exception") code> Vous aurez l'exception à votre main. Je jetterais un coup d'oeil à tous les attributs de demande, il y a peut-être une référence directe au contrôleur d'origine.
import org.codehaus.groovy.grails.web.errors.GrailsWrappedRuntimeException
def action = {
def exception = request.getAttribute('exception')
if (exception instanceof GrailsWrappedRuntimeException) {
log.error "exception $exception.className, line $exception.lineNumber has throw $exception.cause"
}
}
Je ne sais toujours pas si l'exception a été soulevée dans l'admincontrôleur ou dans l'Usercontroller, c'est ce que je suis intéressé par
demande.gettattribute ('exception'). Nom de classe devrait le faire.
Pour montrer une page différente de "erreur 500", je pense que vous pourriez faire de la même manière avec des échafaudages de Grails:
Premièrement, nous devons simplement spécifier la vue en mappage d'URL: P>
<h1>Grails Runtime Exception</h1> <h2>Error Details</h2> <div class="message"> <strong>Error ${request.'javax.servlet.error.status_code'}:</strong> ${request.'javax.servlet.error.message'.encodeAsHTML()}<br/> <strong>Servlet:</strong> ${request.'javax.servlet.error.servlet_name'}<br/> <strong>URI:</strong> ${request.'javax.servlet.error.request_uri'}<br/> <g:if test="${exception}"> <strong>Exception Message:</strong> ${exception.message?.encodeAsHTML()} <br/> <strong>Caused by:</strong> ${exception.cause?.message?.encodeAsHTML()} <br/> <strong>Class:</strong> ${exception.className} <br/> <strong>At Line:</strong> [${exception.lineNumber}] <br/> <strong>Code Snippet:</strong><br/> <div class="snippet"> <g:each var="cs" in="${exception.codeSnippet}"> ${cs?.encodeAsHTML()}<br/> </g:each> </div> </g:if> </div> <g:if test="${exception}"> <h2>Stack Trace</h2> <div class="stack"> <pre><g:each in="${exception.stackTraceLines}">${it.encodeAsHTML()}<br/></g:each></pre> </div> </g:if>
Je ne sais toujours pas si l'exception a été soulevée dans l'admincontrôleur ou dans l'Usercontroller, c'est ce que je suis intéressé par
@David: The $ {Demande.'JAVAX.Servlet.Error.Message'.Encodeashtml ()} Contient souvent le nom du contrôleur, vous pouvez rechercher la chaîne "contrôleur" dedans, obtenu le premier point (".") avant et obtenir la sous-chaîne. Ou vous pouvez jeter votre propre exception.
@David: Je pense que ce sera mieux si vous inclut @ hoàng long lorsque vous commenciez, de sorte que je vais avoir une notification
Exception.ClassName est la variable ciblée BU Le problème est de savoir comment l'obtenir à partir d'un autre contrôleur qui gère la page d'exception, pas à partir d'une vue. Acclamations.
@AOI KARASU: Merci d'avoir souligné Exception.ClassName, je ne remarque pas ce moyen simple :). Peut-être que ma réponse n'est pas claire, mais d'obtenir du contrôleur ou de la vue est la même
Vous pouvez accéder à l'exception dans votre errorController via requête.Exception code>. L'exception de niveau supérieur pointe toujours sur le contrôleur où il a été lancé afin que vous puissiez trouver le nom du contrôleur avec
exception.classname code>. Voici un exemple très simple.
class ErrorController {
def show = {
def exception = request.exception
render(text: "Exception in ${exception?.className}",
contentType: "text/plain", encoding: "UTF-8")
}
}
Vous pouvez accéder à l'instance de contrôleur qui manipulait la mauvaise demande via l'attribut de la demande pour obtenir le nom du contrôleur: p> J'ai testé cela dans GRAVES 2.0 et 2.2 mais je peux 'T Trouvez-le documenté n'importe où, il peut donc être différent dans différentes versions de grails. Pour voir tous les attributs disponibles dans votre demande, ajoutez les points suivants à org.codehaus.groovy.grails.controller code> E.G. (dans gsp):
error.gsp code>: p>
J'ai parfois annoter mes contrôleurs avec une description que je voudrais montrer dans le message d'erreur:
class ErrorsController { def index() { def initialController = request.exception?.className if (initialController) { def controller = grailsApplication.getArtefact("Controller", initialController).getReferenceInstance() render "Controller: ${initialController}, annotations ${controller.getClass().getDeclaredAnnotations()}" return } render 'no initial controller' }