其实就是由于越界等问题所导致的panic,我们该如何解决
文中提到了两个方法,一种是使用defer,推迟错误的执行
第二种:recover函数 (需要在defer里面生效)可以避免panic生效而导致整个函数终止
package main
import "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 gee
import (
"fmt"
"log"
"net/http"
"runtime"
"strings"
)
func trace(message string) string {
var pcs [32]uintptr
n := runtime.Callers(3,pcs[:])
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))
//trace函数用来出发panic的堆栈信息
c.Fail(http.StatusInternalServerError, "Internal Server Error")
}
}()
c.Next()
}
}
这个trace代码涉及了太多不知道的知识,这里就此别过算了
总结一下:感觉day7不是那么重要,day1-day6或多或少都可以得到很多有用的东西,不过感觉对于框架这个东西没有那么陌生了,太好了