golang异常处理

go语言没有使用像java python等语言的try catch/except 语句来处理异常,而是使用它特有的panic,recover,defer来捕获和处理异常

  • defer 这个关键字修饰的语句不会立即执行,而是在函数执行完成将要退出前执行
  • panic 用来抛出异常,类似于python的raise, 函数执行到这里后不再执行后面的语句,但函数退出前还是会执行defer修饰的语句
  • recover是个内置函数,用来捕获异常,recover必须定义在defer语句后面
    下面来看个例子
package main

import "fmt"

func main() {
    c := divide(1, 0)
    fmt.Println(c)
    fmt.Println("execute completly")
}

func divide(a, b int) int {
    defer func() {
        err := recover()
        if err != nil {
            fmt.Println("error happen!")
            fmt.Println(err)
        } else {
            fmt.Println("all right")
        }
    }() //匿名函数,这里必须要带上()

    if b == 0 {
        panic("divided by zero!!")
    }
    return a / b
}
//输出
error happen!
divided by zero!!
0
execute completly

分析:
divide是一个做除法的函数,可能会出现除数为0的错误,所以在函数一开头就定义了一个defer匿名函数(注意这里的匿名函数定义完后面要带上括号才能执行),这个匿名函数被defer修饰了所以只在divide函数执行完才会执行,而不是一进来就执行。后面判断b是否等于0,如果为零的话我们手动使用panic抛出了异常,这个异常是在divide函数退出前执行的defer匿名函数里通过recover()来捕获的,如果err不为空就说明发生了错误,打印error happen!和panic抛出的divided by zero!! 然后主协程返回到主函数main里,继续执行后面的打印

你可能感兴趣的:(golang异常处理)