7
votes

Comment savoir d'où a été lancé Erreur 500 (Grails)

J'ai le scénario suivant dans mes urlmapings.groovy: xxx

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.

Des idées?

Merci d'avance.


0 commentaires

5 Réponses :


8
votes

Utilisation de 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.

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>

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"
   }
}


2 commentaires

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.



1
votes

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>


5 commentaires

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



13
votes

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")
    }
}


0 commentaires

0
votes

Vous pouvez accéder à l'instance de contrôleur qui manipulait la mauvaise demande via l'attribut de la demande org.codehaus.groovy.grails.controller E.G. (dans gsp): xxx

pour obtenir le nom du contrôleur: xxx

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 à error.gsp : xxx


0 commentaires

0
votes

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'
}


0 commentaires