做好每一件事,读好每一本书,天道酬勤
七天实现web框架--错误处理
2022-04-18 / 2 min read

很快到了七天实现web框架的最后一天了,今天的主题是错误处理,在go语言中我们是没有像其他语言一样的处理机制了。

错误处理

在go语言中,我们使用panic对异常进行抛出,这样会将程序直接中断,但是这样肯定是不好的。
我们首先来看一下,defer的应用,对于defer函数,我们需要知道的是,defer就是将操作进行一个延迟,然后等待return前进行执行,这里是一个栈的实现方式。所以是先进后出的。
然后我们还要知道的是recover的使用,这个一定要在defer之后进行使用,它的作用是将panic的错误进行一个压栈的操作,这样程序就不会直接中断,起到了一个try-catch的作用。

具体的实现

package gee

import (
 "fmt"
 "log"
 "net/http"
 "runtime"
 "strings"
)

// print stack trace for debug
func trace(message string) string {
 var pcs [32]uintptr
 n := runtime.Callers(3, pcs[:]) // skip first 3 caller

 var str strings.Builder
 str.WriteString(message + "\nTraceback:")
 for _, pc := range pcs[:n] {
 	fn := runtime.FuncForPC(pc)
 	file, line := fn.FileLine(pc)
 	str.WriteString(fmt.Sprintf("\n\t%s:%d", file, line))
 }
 return str.String()
}

func Recovery() HandlerFunc {
 return func(c *Context) {
 	defer func() {
 		if err := recover(); err != nil {
 			message := fmt.Sprintf("%s", err)
 			log.Printf("%s\n\n", trace(message))
 			c.Fail(http.StatusInternalServerError, "Internal Server Error")
 		}
 	}()

 	c.Next()
 }
}