2012-12-11 15 views
5

Budujemy witrynę internetową, korzystając z wbudowanych funkcji, takich jak http.HandleFunc, aby skonfigurować routing i pakiet do renderowania stron. Nic nadzwyczajnego i działa dobrze. Teraz mam do myślenia o obsłudze błędów i chciałbym złapać paniki i co tam, i przekierować na stronę błędów statycznych. Jaki jest najlepszy sposób na zrobienie tego przy użyciu go?Strony błędów w aplikacji internetowej opartej na programie google

Metoda brute force, o którą się zastanawiałem, to po prostu przekierować po wykryciu błędu, ale byłoby miło z ogólnym haczykiem - wszystko również. Nie znalazłem niczego w dokumentach na ten temat.

(myśląc także o błędy 404 wzdłuż tej samej linii.)

Odpowiedz

8

Jest doskonałym napisać na golang blogu o obsługę błędów i to konkretnie obejmuje błędy internetowych związanych z końcem.

http://blog.golang.org/2011/07/error-handling-and-go.html

Zasadniczo, można owinąć regularne programy obsługi HTTP z własnego, który może zwróci błąd. Opakowanie sprawdza, czy nowe procedury obsługi zwracają błąd, a jeśli tak, to reaguj. Używam czegoś podobnego do tego, co nazywam odzyskiwaniem. Oto fragment kodu, którego używam (który jest bezpłatny i otwarty).

Podczas gdy jeszcze nie dostarczam niestandardowej strony dla błędów, to było to w mojej głowie i powinno być łatwe do dodania.

// 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) 
     } 
    } 
} 
Powiązane problemy