go语言不像python,java有try,cathch,所以我们需要手动抛出
```go
func fn1(a,b int) int{
return a/b
}

这是一个很经典的函数,我们都知道当除数为0时,肯定是除不了的,我们此时调用

fn1(10,0)

image
我们便可以看到此时抛出了除数不为0的异常

panic

当然我们也可以手动的抛出

func fn1(a,b int) int{
if b==0{
panic("runtime error: integer divide by zero")
}
return a/b
}

//在主函数内
func main(){
fn1(10,0)
fmt.Println("10")
}

此时的结果和上面的截图一样,程序抛出异常后就结束了导致我们后面的
fmt.Println(“10”)无法执行

recover

panic 可以在任何地方引发,但recover只有在defer调用的函数中有效,结合我们上一篇章的defer

func fn1(a,b int) int{
defer func(){
err:=recover()
if err!=nil{
fmt.Printf("error:%v\n",err)
}
}()
return a/b
}

//在主函数内
func main(){
fn1(10,0)
fmt.Println(f2(10, 1))
}

这样使用recover后我们后面的函数也能执行了
image

recover 与panic结合使用

func readFile(filename String) error {
if filename=="main.go"{
return nil
}else{
return errors.New("读取文件失败")
}
}

func myfn(){
defer func(){
e:=recover()
if e!=nil{
fmt.Printf("error:%v",err)
}
err:=readFile("xxx.go")
if err!=nil{
panic(err)
}
}
}


func main(){
myfn()
fmt.Println("ok")
}

结果便是error:读取文件失败 ok

执行的逻辑也很好理解
panic抛出这个异常,recover接受到这个异常,恢复并打印出错误