报错信息如下:
http: named cookie not present
引起问题的代码:
cookie, err := r.Cookie("user")
if err != nil {
log.Fatal(err)
}
问题的现象就是,浏览器在发送http请求的时候,在Request中没有我们需要的Cookie:user=XXX
,因此代码执行log.Fatal(err)
,然后退出了。
开始以为是Cookie的问题,其实是golang错误处理的理解不到位。
Fatal()
:等价于Print()
然后会执行os.Exit()
调用。也就是说,上面的程序执行过程中遇到err就会直接打印日志信息,并退出了。
Panic()
:等价于Println()
然后会执行内置函数panic()。同样的,panic之后程序也会退出,不过会打印出更详细的信息。但是panic可以用recover来避免程序崩溃。
关于,panic、recover、defer的具体说明和用法,参考这里。
大部分情况下,都希望记录并打印异常,但是程序不崩溃继续运行。
所以上面的代码可以这样修改:
defer func() {
// p!=nil 判断确实发生了panic
if p := recover(); p != nil {
log.Printf("panic: %s\n", p)
}
}()
cookie, err := r.Cookie("user")
if err != nil {
panic(err)
}
其实有很多比官方log库更好用的一些记录日志的库,比如go-kit
的log库。