0

私たちの場合、エラー URL を含むページhttp://localhost:3000/panicでエラーが発生した自分に電子メールを送信したいと考えています。しかし、メソッド内/panicからURLを取得する方法がわかりません。c martini.ContextRecoverWrap

package main

import (
    "errors"
    "github.com/go-martini/martini"
    "net/http"
)

func main() {
    m := martini.Classic()
    m.Use(RecoverWrap)
    m.Get("/panic", func() {
        panic("some panic")
    })

    m.Get("/", func(req *http.Request, res http.ResponseWriter) {
        res.Write([]byte("mainPage"))
    })

    m.Run()
}

func RecoverWrap(c martini.Context, w http.ResponseWriter) {
    var err error
    defer func(w http.ResponseWriter) {
        r := recover()
        if r != nil {
            switch t := r.(type) {
            case string:
                err = errors.New(t)
            case error:
                err = t
            default:
                err = errors.New("Unknown error")
            }
            // how to get request url here
            // I want to send email with error url
            http.Error(w, "Something goes wrong", http.StatusInternalServerError)
        }
    }(w)
    c.Next()
}
4

1 に答える 1

0

答えは、req *http.Requestパラメータを追加することですfunc RecoverWrap(c martini.Context, req *http.Request, w http.ResponseWriter)

完全なコード:

package main

import (
    "errors"
    "fmt"
    "github.com/go-martini/martini"
    "net/http"
)

func main() {
    m := martini.Classic()
    m.Use(RecoverWrap)
    m.Get("/panic", func() {
        panic("some panic")
    })

    m.Get("/", func(req *http.Request, res http.ResponseWriter) {
        res.Write([]byte("mainPage"))
    })

    m.Run()
}

func RecoverWrap(c martini.Context, req *http.Request, w http.ResponseWriter) {
    var err error
    defer func(w http.ResponseWriter) {
        r := recover()
        if r != nil {
            switch t := r.(type) {
            case string:
                err = errors.New(t)
            case error:
                err = t
            default:
                err = errors.New("Unknown error")
            }

            fmt.Println("req.URL.Path")
            fmt.Println(req.URL.Path)
            http.Error(w, "Something goes wrong", http.StatusInternalServerError)
        }
    }(w)
    c.Next()
}
于 2015-03-01T04:32:10.857 に答える