很快到了七天实现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()
 }
}

BytesLzz
2 声望2 粉丝

本人学生一名,就读于成都东软学院。主要的开发语言是go语言