2012-12-11 19 views
5

हम पृष्ठों को प्रस्तुत करने के लिए रूटिंग और html.template पैकेज सेट करने के लिए केवल http.HandleFunc जैसी अंतर्निर्मित सामग्री का उपयोग करके वेब साइट बना रहे हैं। वास्तव में कुछ भी पसंद नहीं है और यह ठीक काम करता है। अब मैं त्रुटि प्रबंधन के बारे में सोचने के लिए चारों ओर घूम गया और पैनिक्स और व्हाट्सॉट्स को पकड़ना और एक स्थिर त्रुटि पृष्ठ पर रीडायरेक्ट करना चाहता हूं। जाने के साथ ऐसा करने का सबसे अच्छा तरीका क्या है?जाने-आधारित वेब एप्लिकेशन में त्रुटि पृष्ठ

ब्रूट फोर्स दृष्टिकोण मैं पहले सोच रहा हूं कि जब कोई त्रुटि पता चलती है तो रीडायरेक्ट करना है, लेकिन यह सामान्य पकड़ के साथ भी अच्छा होगा। मुझे इसके बारे में दस्तावेज़ों में कुछ भी नहीं मिला।

(इसके अलावा उसी तर्ज पर 404 के बारे में सोच।)

उत्तर

8

त्रुटि हैंडलिंग के बारे में 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) 
     } 
    } 
}