golang捕获panic
2016-02-28 21:40
651 查看
golang当中panic的时候如果启动的goroutine比较多,刷的信息满屏都是,在终端工具上因为刷的信息太多,找不到前边的信息,因此很有必要程序自己捕获panic,并且将错误信息输出到文件当中,以便定位排查问题。
以下是一段捕获panic的代码
以下是测试程序,这里我们测试除数为0的异常
捕获的错误信息如下:
至此获取错误并且存储的功能已经实现。
最后注意,如果是启动的多goroutine,需要在每个goroutine执行函数的时候,写上
以下是一段捕获panic的代码
package main import ( "fmt" "os" "runtime/debug" "time" ) func PanicHandler() { exeName := os.Args[0] //获取程序名称 now := time.Now() //获取当前时间 pid := os.Getpid() //获取进程ID time_str := now.Format("20060102150405") //设定时间格式 fname := fmt.Sprintf("%s-%d-%s-dump.log", exeName, pid, time_str) //保存错误信息文件名:程序名-进程ID-当前时间(年月日时分秒) fmt.Println("dump to file ", fname) f, err := os.Create(fname) if err != nil { return } defer f.Close() if err := recover(); err != nil { f.WriteString(fmt.Sprintf("%v\r\n", err)) //输出panic信息 f.WriteString("========\r\n") } f.WriteString(string(debug.Stack())) //输出堆栈信息 }
以下是测试程序,这里我们测试除数为0的异常
package main import ( "fmt" //"sync" ) func test_panic() { n := 0 i := 5 / n fmt.Println(i) } func main() { defer PanicHandler() test_panic() /* var wg sync.WaitGroup wg.Add(1) go func() { defer PanicHandler() test_panic() wg.Done() }() wg.Wait() */ }
捕获的错误信息如下:
runtime error: integer divide by zero ======== F:/MyProject/Go/src/panictest/panicHandler.go:31 (0x4017c2) PanicHandler: f.WriteString(string(debug.Stack())) //输出堆栈信息 c:/go/src/runtime/asm_amd64.s:437 (0x4543e5) call32: CALLFN(·call32, 32) c:/go/src/runtime/panic.go:423 (0x4291f7) gopanic: reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz)) c:/go/src/runtime/panic.go:24 (0x427740) panicdivide: panic(divideError) c:/go/src/runtime/signal_windows.go:166 (0x43a31f) sigpanic: panicdivide() F:/MyProject/Go/src/panictest/main.go:10 (0x401073) test_panic: i := 5 / n F:/MyProject/Go/src/panictest/main.go:16 (0x40119c) main: test_panic() c:/go/src/runtime/proc.go:111 (0x42b78e) main: main_main() c:/go/src/runtime/asm_amd64.s:1721 (0x456821) goexit: BYTE $0x90 // NOP
至此获取错误并且存储的功能已经实现。
最后注意,如果是启动的多goroutine,需要在每个goroutine执行函数的时候,写上
defer PanicHandler()否则的话是捕获不到其他goroutine当中的painc信息的。
相关文章推荐
- Go 语言 Channel 实现原理精要
- Go语言将支持Android
- Golang实现的聊天程序服务端和客户端代码分享
- Golang学习笔记(三):控制流
- Golang学习笔记(二):类型、变量、常量
- Golang中的sync.WaitGroup用法实例
- Go语言struct类型介绍
- golang使用正则表达式解析网页
- Golang极简入门教程(三):并发支持
- Golang极简入门教程(四):编写第一个项目
- Golang记录、计算函数执行耗时、运行时间的一个简单方法
- 深入解析Go语言中for循环的写法
- Golang学习笔记(四):array、slice、map
- 理解Golang中的数组(array)、切片(slice)和map
- golang语言中for循环语句用法实例
- Golang学习笔记(一):简介
- golang操作mongodb的方法
- GO语言(golang)基础知识
- ubuntu下搭建Go语言(golang)环境
- Golang 内存模型详解(一)