go每天一练 panic,recover 异常处理

go语言没有其他语言的 try{}catch(){} 语法,所以处理错误,多参数返回时,通过判断来确定程序是否出错。

例如:

func func1() (string,error){
....
}
if _,err := func1();err != nil {
fmt.Println("程序出错了!")
}
但是go语言还给我们提供了panic和recover,使我们处理错误有了一个新途径。panic()传入的interface{}类型,调用panic()函数产生的是一个能中断程序的异常。panic()函数不会立即返回,但如果调用recover()的话。


使用 defer 捕获错误

例如:
defer func(){
if err:=recover();err!=nil {
fmt.Println(err)
}
}()

不过需要注意的是,recover()之后。逻辑并不会恢复到panic那个点去,函数在defer之后返回。


例子:

package main

import "fmt"

func main() {

defer func() {
if err := recover();err != nil {
fmt.Println(err)
}
}()

fmt.Println(1)
panic("error1")
func1()
fmt.Println("error3")


//结果打印
  //1
  //error1
  //错误抛出后,在第一个panic就停止执行了
}

func func1(){
fmt.Println(2)
panic("error2")
}


例子:

package main

import "fmt"

func main(){

fmt.Println(1)
error1()
fmt.Println(2)
error2()
fmt.Println(3)
//结果打印
  //1
  //func1 1
  //error1  //错误在函数里面 recover 捕获继续往下执行
  //2
  //func2 1
  //error2
  //3
}

func error1(){
defer func() {
if err:= recover();err != nil {
fmt.Println(err)
}
}()
fmt.Println("func1 1")
panic("error1")
fmt.Println("func1 2")
}

func error2() {
defer func() {
if err:= recover();err != nil {
fmt.Println(err)
}
}()
fmt.Println("func2 1")
panic("error2")
fmt.Println("func2 2")
}


例子:

package main

import "fmt"

type myerror struct {
code int
  msg string
}

func main() {
fun1()
}

func fun1() {
defer func() {
if err := recover();err != nil {
fmt.Printf("错误信息为:%s,错误码为:%d\n",err.(myerror).msg,err.(myerror).code)
}
}()

panic(myerror{code:100,msg:"发生错误"})
}


在线交流