त्रुटि हैंडलिंग के बारे में golang ब्लॉग पर एक महान लिखने अप नहीं है और यह विशेष रूप से अंत में वेब से संबंधित त्रुटियों को शामिल किया गया।
http://blog.golang.org/2011/07/error-handling-and-go.html
मूल रूप से, आप अपने खुद के साथ नियमित रूप से http संचालकों कि एक त्रुटि लौट सकते हैं लपेट दें। रैपर जांचता है कि क्या आपके नए हैंडलर एक त्रुटि लौटाते हैं और यदि ऐसा प्रतिक्रिया है। मैं इस तरह के कुछ का उपयोग करता हूं जहां मैं ठीक कहता हूं। यहां मेरे द्वारा उपयोग किए जाने वाले कोड का एक स्निपेट है (जो मुफ़्त और खुला है)।
जबकि मैं अभी तक त्रुटियों के लिए एक कस्टम पेज प्रदान नहीं करता हूं, यह मेरे दिमाग में है और जोड़ने के लिए तुच्छ होना चाहिए।
// Error is the expected return of a dae.Handler, or nil otherwise.
type Error struct {
Error error
Code int
Message string
}
// NewError is a helper for creating an Error pointer.
func NewError(err error, code int, msg string) *Error {
return &Error{err, code, msg}
}
// Handler is used to cast functions to its type to implement ServeHTTP.
// Code that panics is automatically recovered and delivers a server 500 error.
type Handler func(http.ResponseWriter, *http.Request) *Error
// NewHandler is a helper to chain multiple functions together.
func New(fn ...Handler) Handler {
if len(fn) == 0 {
panic("No Handlers passed in.")
}
h := Handler(fn[0])
for i := 1; i < len(fn); i++ {
h = h.Add(fn[i])
}
return h
}
// ServeHTTP implements the http.Handler interface. If an appHandler returns an
// error, the error is inspected and an appropriate response is written out.
func (fn Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
defer func() {
if r := recover(); r != nil {
log.Printf("%v", r)
http.Error(w, "A serious error has occured.", 500)
if Debug {
panic(r.(error))
}
}
}()
if e := fn(w, r); e != nil {
log.Printf("Code: %v, Message: \"%s\", Error: %v", e.Code, e.Message, e.Error)
switch e.Code {
case 500:
http.Error(w, e.Message, e.Code)
case 404:
http.NotFound(w, r)
fmt.Fprint(w, e.Message)
case 200:
fmt.Fprint(w, e.Message)
}
}
}