建议每起一个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 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦