golang近幾年愈來愈火,尤爲今年,我是一個不甘被拋棄的程序猿,所以在平常工做中,也開始使用go語言,Web框架主要使用dotweb框架,按照github上描述的主要特性以下:git
今天我主要想說說最後一個特性裏提到的,「統一的 HTTP 錯誤處理」。github
那麼,在dotweb裏如何優雅的處理呢? golang
咱們先看下dotweb程序發生異常的時候,默認狀況下,看會發生什麼?web
package main import ( "fmt" "github.com/devfeel/dotweb" "strconv" ) func main() { //初始化DotServer app := dotweb.New() //開啓development模式 app.SetDevelopmentMode() //設置路由 InitRoute(app.HttpServer) // 開始服務 port := 8080 fmt.Println("dotweb.StartServer => " + strconv.Itoa(port)) err := app.StartServer(port) fmt.Println("dotweb.StartServer error => ", err) } func DefaultError(ctx dotweb.Context) error { panic("my panic error!") } func InitRoute(server *dotweb.HttpServer) { server.Router().GET("/error", DefaultError) }
看看,訪問會發生什麼?websocket
ok。確實輸出了咱們的異常信息,不過下面跟着這麼一大堆調用堆棧,明顯是不能給用戶看到的,參考其餘Web容器,通常會返回用戶一段:Internal Server Errorapp
這裏能夠經過將代碼裏的app.SetDevelopmentMode() 改成 app.SetProductionMode(),咱們再看下訪問結果:框架
ok,知足咱們的要求了。socket
看到這裏,你們是否以爲缺了點什麼,就只能這麼兩種方式麼?很明顯,不是的:)函數
咱們老是但願一個框架能給咱們足夠的靈活性,足夠的定製空間,順着這個思路,咱們來分析下。測試
咱們先看下dotweb的最核心的結構體定義:
DotWeb struct {
HttpServer *HttpServer cache cache.Cache OfflineServer servers.Server Config *config.Config Modules []*HttpModule Middlewares []Middleware ExceptionHandler ExceptionHandle NotFoundHandler NotFoundHandle AppContext *core.ItemContext middlewareMap map[string]MiddlewareFunc middlewareMutex *sync.RWMutex }
果真,其中有一項:ExceptionHandler,進一步看下這個怎麼定義的:
ExceptionHandle func(Context, error)
額,很簡單有沒有?果真很簡單那!二話不說,咱們趕忙來測試下。
先作個簡單測試,好比程序發生錯誤時,咱們向用戶輸出一個 error 字符串,咱們來看下怎麼作:
package main import ( "fmt" "github.com/devfeel/dotweb" "strconv" ) func main() { //初始化DotServer app := dotweb.New() //設置路由 InitRoute(app.HttpServer) //設置自定義異常處理接口 app.SetExceptionHandle(func(ctx dotweb.Context, err error) { ctx.WriteString("oh, 我竟然出錯了! ", err.Error()) }) // 開始服務 port := 8080 fmt.Println("dotweb.StartServer => " + strconv.Itoa(port)) err := app.StartServer(port) fmt.Println("dotweb.StartServer error => ", err) } func DefaultError(ctx dotweb.Context) error { panic("my panic error!") } func InitRoute(server *dotweb.HttpServer) { server.Router().GET("/error", DefaultError) }
訪問下,會看到什麼?
一切順利,輸出了咱們但願看到的內容。
看到這裏,你們是否有一個直觀的印象?dotweb中,對於應用未處理的異常,只要經過設置SetExceptionHandle自定義處理函數,就能夠對異常作你想作的任何事:)
歡迎你們關注dotweb,一個成長中的go web框架。但願你們多給建議!
github地址:https://github.com/devfeel/dotweb
QQ羣:193409346