go语言对异常的处理没有使用其他编程语言中常见的 try---catch来处理。go语言追求简洁优雅。在go语言,没有传统的异常概念,go使用panic和recover机制对程序的严重异常进行处理(例如整数除)
在一般业务代码里面,go官方推荐通过error状态返回错误
// 按惯例 将err 总是放到最后一个参数返回
func doSomething(v interface{}) (n int, err error) {
// 这里是函数业务逻辑
return
}
// 处理时这样处理
num,err := doSomething()
if err != nil{
//执行相关错误处理
}
//正常处理流程
panic 与 recover 类似php与java中的try/catch。并且panic与recover都是go 语言中的函数而非语句。panic中断当前函数流程,执行延迟调用(defer),在延迟调用中 ,通过recover捕获panic提交的错误对象
func panic(v interface{})
func recover() interface{}
func main() {
num := test()
fmt.Println(num) // 此时num为0
}
func test() int {
// 必须要先声明defer,否则不能捕获到panic异常,也就是说要先注册函数,后面有异常了,才可以调用
defer func() {
if err := recover(); err != nil {
fmt.Println("终于捕获到了panic产生的异常:", err) // 这里的err其实就是panic传入的内容
}
}()
panic("fanic 发生了")
fmt.Println("panic发生后")
return 10
}
- 补充:延迟调用语句defer与异常没有直接关系,如果没有发生panic仍然会执行导defer。上面例子只是 使用defer进行revover
- defer必须在panic之前声明,否则当panic时,recover无法捕获到panic