其实就是由于越界等问题所导致的panic,我们该如何解决
文中提到了两个方法,一种是使用defer,推迟错误的执行
第二种:recover函数 (需要在defer里面生效)可以避免panic生效而导致整个函数终止
package mainimport "fmt"func test_recover() {defer func() {fmt.Println("defer func")if err := recover(); err != nil {//当出现panic的时候,recover捕获//并恢复程序的正常执行fmt.Println("recover success")}}()arr := []int{1, 2, 3}fmt.Println(arr[4])fmt.Println("take a flag")
}func main() {test_recover()fmt.Println("after recover")
}
Gee 的错误处理机制
感觉就是增强框架的健壮性吧
实例中说了一个数组越界的例子
然后我们可以利用中间件的机制,对每一条路径首先进行中间件的处理,这可以
package geeimport ("fmt""log""net/http""runtime""strings"
)func trace(message string) string {var pcs [32]uintptrn := runtime.Callers(3,pcs[:])var str strings.Builderstr.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))//trace函数用来出发panic的堆栈信息c.Fail(http.StatusInternalServerError, "Internal Server Error")}}()c.Next()}}
这个trace代码涉及了太多不知道的知识,这里就此别过算了
总结一下:感觉day7不是那么重要,day1-day6或多或少都可以得到很多有用的东西,不过感觉对于框架这个东西没有那么陌生了,太好了