一、前言
这里类似于多数语言,都有抛出异常,处理异常的操作,但是不是try...catch的结构,而是使用了之前提到的defer的方式进行。
二、学习代码
package main
import (
"errors"
"fmt"
)
func test() {
defer fmt.Println("defer function1") //defer是先进后出,压入栈中,函数结束时,从栈中取出
defer func() { //此处的defer是用来捕获异常的,匿名函数的样子
if err := recover(); err != nil { //遇到异常,执行defer的recover后,就不在recover之前的defer了
fmt.Println("recover from panic")
fmt.Println(err)
fmt.Printf("err type: %T\n", err)
}
}()
defer fmt.Println("defer function2")
defer fmt.Println("defer function3")
num1 := 1
num2 := 0
num3 := num1 / num2
fmt.Printf("num3 = %d\n", num3)
return
}
func test2() error {
//panic("this is a panic") //抛出异常
return errors.New("this is 一个 错误") //返回一个错误
}
func main() {
test()
fmt.Println("main function")
err := test2()
if err != nil {
fmt.Println(err)
}
err = errors.New("this is another error")
if err != nil {
panic(err) //抛出异常,停止运行,panic尽量用来处理一些严重错误,建议少用。
}
}