2012-12-11 30 views
5

我們正在構建一個網站,只使用內置的東西如http.HandleFunc來設置路由和html.template包來呈現網頁。沒有什麼奇特的,它工作正常。現在我開始思考錯誤處理問題,並希望捕捉恐慌情緒,並將其重定向到靜態錯誤頁面。去做什麼是最好的方法?基於網頁應用程序的錯誤頁面

我一直在琢磨的蠻力方法是在檢測到錯誤時重定向,但對於通用的catch-all也會很好。我沒有在關於它的文檔中找到任何內容。

(還想着沿着相同的路線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) 
     } 
    } 
} 
相關問題