對 dotweb 框架進行統一的自定義錯誤處理

golang近幾年愈來愈火,尤爲今年,我是一個不甘被拋棄的程序猿,所以在平常工做中,也開始使用go語言,Web框架主要使用dotweb框架,按照github上描述的主要特性以下:git

Features

  • 支持靜態路由、參數路由、組路由
  • 路由支持文件/目錄服務,支持設置是否容許目錄瀏覽
  • 中間件支持,支持App、Group、Router級別的設置
  • Feature支持,可綁定HttpServer全局啓用
  • 支持STRING/JSON/JSONP/HTML格式輸出
  • 統一的HTTP錯誤處理
  • 統一的日誌處理
  • 支持Hijack與websocket
  • 內建Cache支持
  • 支持接入第三方模板引擎(需實現dotweb.Renderer接口)
  • 模塊可配置化,85%模塊可經過配置維護

今天我主要想說說最後一個特性裏提到的,「統一的 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

相關文章
相關標籤/搜索