2012-12-11 65 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) 
     } 
    } 
} 
相关问题