1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > golang panic和recover 捕获异常

golang panic和recover 捕获异常

时间:2018-11-25 05:27:01

相关推荐

golang panic和recover 捕获异常

func panic(interface{})和func recover() interface{}是Golang中用于错误处理的两个函数。

panic的作用就是抛出一条错误信息,从它的参数类型可以看到它可以抛出任意类型的错误信息。在函数执行过程中的某处调用了panic,则立即抛出一个错误信息,同时函数的正常执行流程终止,但是该函数中panic之前定义的defer语句将被依次执行。之后该goroutine立即停止执行。

recover()用于将panic的信息捕捉。recover必须定义在panic之前的defer语句中。在这种情况下,当panic被触发时,该goroutine不会简单的终止,而是会执行在它之前定义的defer语句。

下面是简单的例子:

捕捉自己设置的panic错误:

package mainimport "fmt"import "math"func foo(a int) {defer fmt.Println("foo退出来了")defer func() {if r := recover(); r != nil {fmt.Printf("捕获到的错误:%s\n", r)}}()if a < 0 {panic("必须输入大于0的数")}fmt.Println("该数的方根为:", math.Sqrt(float64(a)))}func main() {var a inta = 10fmt.Printf("a=%d\n", a)foo(a)var b intb = -10fmt.Printf("b=%d\n", b)foo(b)fmt.Println("该goroutine还可以执行")}// ///a=10该数的方根为: 3.1622776601683795foo退出来了b=-10捕获到的错误:必须输入大于0的数foo退出来了该goroutine还可以执行Process finished with exit code 0

捕捉go语言内部的Panic错误:

package mainimport "fmt"func foo() {defer func() {if r := recover(); r != nil {fmt.Printf("捕获到的错误:%s\n", r)}}()var a, b inta, b = 1, 1c := 3/(a-b)fmt.Println(a, b, c)}func main() {foo()}//====捕获到的错误:runtime error: integer divide by zero

利用golang自带包 runtime/debug 异常时打印

DebugInfo.go

package mainimport ("fmt""os""runtime/debug""time")func TryE() {errs := recover()if errs == nil {return}exeName := os.Args[0] //获取程序名称now := time.Now() //获取当前时间pid := os.Getpid() //获取进程IDtime_str := now.Format("0102150405")//设定时间格式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()f.WriteString(fmt.Sprintf("%v\r\n", errs)) //输出panic信息f.WriteString("========\r\n")f.WriteString(string(debug.Stack())) //输出堆栈信息}

测试异常捕获 main.go

package mainimport ("fmt""time")func main() {defer TryE()fmt.Println(time.Now())panic(-2)fmt.Println("panic restore now, continue.")}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。