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