新上的项目,在运行一段时间后,会出现自动崩溃的情况。从日志没有看出任何错误(使用logger包进行打印的日志)。每次崩溃的前夕,程序一直在正确的运行(崩溃)。前几天程序又出错,恰巧调用接口也发现不能调用。于是得出在日志文件中可能没有打印错误日志。于是联想到模拟调接口异常,看看是否能将错误日志写入到日志文件中。果不其然,不能。只能在本地的控制台中,看到,并且发现程序调接口出错后,程序自动宕了。所以想着把这个错误日志也写入到日志文件中,以避免因为出错,是程序出现宕机的情况。
go 语言中不能像java中可以使用try/catch 捕获异常,然后程序正常的运行。在go中,如果程序要到panic。程序就会自动崩溃,如果这样的话。在一个运行的系统中是致命的。如何避免呢!
(1)在进行错误判断的时候,在err中添加return。(具体原理不清楚,例子就是这么写的,但在程序中经常忘记添加return,就会出现程序崩溃)
if err != nil{
logger.Info("err=",err)
return //如果在没有添加return的时候,如果这个错误是panic,程序就会崩溃
}
在加了return的时候,程序出错后,并不报panic,而且是正常的结束
在没有添加return的时候,程序会报出panic错误并且程序异常停止。(这种情况在一个正在运行的程序中是致命的)
(2)第二种,使用recover,来恢复程序。
recover :恢复的意思,recover一般用在defer()中,通过recover来终止一个goroutine的panicking过程,从而恢复正常代码的运行(也符合系统的要求)
func main(){
defer func() {
if err:= recover();err != nil{
logger.Info("test发生错误",err)
}
}()
var str ="123"
in,err:=strconv.Atoi(str)
logger.Info("in==",in)
if err!= nil{
logger.Info("err==",err)//假如有异常的时候,defer中的recover()就会恢复程序
}
}