Go 错误的捕获、抛出错误、自定义错误

31 min read

捕捉错误

package main
 
import "fmt"
 
func test() {
	//使用defer + recover来捕获和处理异常
	defer func() {
		err := recover() //内建函数,捕获异常
		if err != nil {
			fmt.Printf("err=%v\n", err)
		}
	}()
	//产生运行时异常
	n1 := 1
	n2 := 0
	fmt.Printf("result=%d\n", n1/n2)
}
 
//异常处理
func main() {
	test()
	fmt.Println("main函数执行结束")
}
 
//执行结果:
err=runtime error: integer divide by zero
main函数执行结束

抛出错误

package main
 
import (
	"errors"
	"fmt"
)
 
func checkBoolean(b bool) error {
	if b {
		fmt.Println("checkBoolean执行成功,没有异常")
		return nil
	}
	//返回自定义异常
	return errors.New("checkBoolean执行失败...")
}
 
func test() {
	err := checkBoolean(false) //输入false产生异常
	if err != nil {
		fmt.Println("checkBoolean执行异常")
		panic(err) //捕获异常,终止执行
	}
	fmt.Println("panic会退出程序的执行,所以当前Print并不会输出")
}
 
 
func main() {
	test()
}

自定义异常

err := errors.New("this is an error")  // errors.New

err := fmt.Errorf("this is an error")  // fmt.Errorf():
package main
 
import (
	"fmt"
	"time"
)
 
// MyError 自定义异常结构体
type MyError struct {
	option    string //异常操作
	errorTime string //异常时间
	msg       string //异常信息
}
 
func createErrorStruct(option string, msg string) *MyError {
	myErr := new(MyError)
	myErr.option = option
	myErr.msg = msg
	now := time.Now()
	myErr.errorTime = now.Format("2006-01-02 15:04:05")
	return myErr
}
 
func (myError *MyError) Error() string {
	errInfo := fmt.Sprintf("option:%s,msg:%s,time:%s\n", myError.option, myError.msg, myError.errorTime)
	return errInfo
}
 
// CheckAdult 检查年龄是否成年
func CheckAdult(age int) (bool, error) {
	if age >= 18 {
		fmt.Printf("年龄:%d,已经成年\n", age)
		return true, nil
	} else if age > 0 && age < 18 {
		fmt.Printf("年龄:%d,未成年\n", age)
		return false, nil
	} else if age == 0 {
		fmt.Println("输入的年龄为0,不合法")
		err := createErrorStruct("check age", "输入的年龄为0,不合法")
		return false, err
	} else {
		panic(createErrorStruct("check age", "输入的年龄小于0,不合法"))
	}
}
 
func test2(age int) {
	res, err := CheckAdult(age)
	if err == nil {
		fmt.Printf("年龄%d是否成年:%t\n", age, res)
	} else {
		fmt.Printf("err[%v]\n", err)
	}
}
 
func main() {
	test2(-1) //参数大于0:执行正常;参数等于0:返回错误;参数小于0:panic终止执行
}