亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

golang關于程序crash原因查找

標簽:
Go

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

package mainimport (    "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崩溃了")
}



作者:WinddddRunner
链接:https://www.jianshu.com/p/0d9dc315c31b

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 1
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消