golang关于程序crash原因查找 - Go语言中文社区

golang关于程序crash原因查找


建议每起一个goroutine,都defer统一捕获下异常
之前的代码是这样的,想在main函数统一捕获所有的异常(包括协程的)并输出到crash.log文件中,但是程序奔溃后crash.log并没有相应的记录。(谨记用defer统一捕获异常只对当前的goroutine有效,goroutine的异常并不会向上传递给main主函数)

package main

import (
    "log"
    "os"
    "time"
)

var Error *log.Logger

func init() {
    errFile, err := os.OpenFile("./crash.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalln("打开日志文件失败:", err)
    }
    Error = log.New(errFile, "Error:", log.Ldate|log.Ltime|log.Lshortfile)
}

func main() {
    defer func() {
        if err := recover(); err != nil {
            Error.Println("程序crash了:", err)
        }
    }()
    go panicFunc()
    time.Sleep(time.Second)
}

func panicFunc() {
    log.Println("panicFunc 开始运行")
    panic("panicFunc崩溃了")
}

后来经大神指教,才明白

func main() {
    defer func() {
        if err := recover(); err != nil {
            Error.Println("程序crash了:", err)
        }
    }()
//TODO:
}

只捕获当前goroutine抛出的异常链,所以如果要捕获异常的话,则需要在每个goroutine加defer函数捕获异常。明白这一点后,panicFunc程序则需改为:

func panicFunc() {
    defer func() {
        if err := recover(); err != nil {
            Error.Println(err)
        }
    }()
    log.Println("panicFunc 开始运行")
    panic("panicFunc崩溃了")
}

版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/0d9dc315c31b
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 12:55:27
  • 阅读 ( 1797 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢