7

UrlMappings.groovy に次のシナリオがあります。

"/user/$action?" (controller:"user")
"/admin/$action?" (controller:"user")

"500"(controller:"error", action:"show")
"404"(controller:"error", action:"show")

また、errorController で、エラー 500 を発生させる例外 (ある場合) がスローされたコントローラーを知り、ユーザーと管理者に異なるエラー ページを表示する必要があります。

何か案は?

前もって感謝します。

4

5 に答える 5

13

経由で ErrorController の例外にアクセスできますrequest.exception。最上位の例外は、例外がスローされたコントローラーを常に指しているため、 でコントローラー名を見つけることができますexception.className。これは非常に簡単な例です。

class ErrorController {

    def show = {
      def exception = request.exception
      render(text: "Exception in ${exception?.className}", 
        contentType: "text/plain", encoding: "UTF-8")
    }
}
于 2011-03-31T08:52:23.483 に答える
8

request.getAttribute("exception")あなたを使用すると、例外が手に入ります。すべてのリクエスト属性を調べます。元のコントローラーへの直接参照がある可能性があります。

アップデート

秘訣は、Grails がスローされた例外をGrailsWrappedRuntimeExceptionにラップして、例外の原因となっているコードへの快適なアクセスを提供することです。エラー コントローラーで次のスニペットを使用します。

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"
   }
}
于 2011-03-30T21:09:51.270 に答える
1

別の「エラー 500」ページを表示するには、Grails の足場で同じ方法を実行できると思います。

まず、URL マッピングでビューを指定する必要があります。

"500"(view: "/500")   // Point to 500.gsp

次に、「500」ビュー コードを次に示します。

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

エラーとスタックトレース (div class="stack") から必要な情報を抽出できます。

ユーザーと管理者用に 2 つの異なるテンプレートをg:if作成すると、ビューに含める必要があるテンプレートがタグによって決定されます。

于 2011-03-31T03:56:30.463 に答える
0

request 属性を介して、不正なリクエストを処理していた Controller インスタンスにアクセスできますorg.codehaus.groovy.grails.CONTROLLER(GSP の場合)。

Controller: ${request['org.codehaus.groovy.grails.CONTROLLER']}

コントローラの名前を取得するには:

Controller name: ${request['org.codehaus.groovy.grails.CONTROLLER_NAME_ATTRIBUTE']}

これを Grails 2.0 と 2.2 でテストしましたが、どこにも文書化されていないので、Grails のバージョンによって異なる場合があります。リクエストで使用可能なすべての属性を表示するには、次を に追加しますerror.gsp

${${request.findAll { true }}
于 2013-03-11T14:05:02.593 に答える