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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,335评论 25 709
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 14,186评论 2 33
  • 我们都是傻子, 是的, 我也是。 区别在于, 我知道我傻…
    泉水里睡着的鹿王阅读 1,274评论 2 4
  • ◆★◆排烟罩,车间降温,工业废气处理设备,管道安装,通风管道安装◆★◆ --------------- 螺旋风管你...
    a594157da7b7阅读 2,312评论 0 0
  • 不是爱一个人才要改变 而是爱自己才要改变才能去爱别人 错过了太多 现在不想再放弃这最后一次机会了 当你140的时候...
    原也Fadea阅读 861评论 0 1