美文网首页GolangGo语言
golang关于程序crash原因查找

golang关于程序crash原因查找

作者: WinddddRunner | 来源:发表于2018-01-11 10:15 被阅读67次

    建议每起一个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崩溃了")
    }
    
    

    相关文章

      网友评论

        本文标题:golang关于程序crash原因查找

        本文链接:https://www.haomeiwen.com/subject/dblznxtx.html