Go 中异常处理
主要掌握 一下几个方面:
- 掌握error接口
- 掌握defer延迟
- 掌握panic及recover
error接口
error是指程序中出现不正常的情况,从而导致程序无法正常运行;
go中为错误的类型提供了简单的错误处理机制
go中error的源码:
// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
type error interface {
Error() string
}
可以看到接口中定义了Error方法,我们可以实现这个方法已实现error接口;
error本质上是一个接口类型,其中包含一个Error()方法,错误值可以存储在变量中,通过函数返回。它必须是函数返回的最后一个值。
在go中处理错误的方式通常是以下的形式:
if err!=nil{
fmt.println(err)
}
代码Demo
func Divide(a,b float64)(float64,error){
if b==0{
return -1 ,errors.New("by zero")
}else {
return a/b, nil
}
}
func main() {
divide, err := Divide(10, 0)
if err!=nil{
fmt.Println(err)
}else {
fmt.Println(divide)
}
}
创建error对象
由于error是一个接口,因此只要实现该接口中的方法就可以:
结构体只要实现了Error() string这种格式的方法,就代表实现了该错误接口,返回值为错误的具体描述
在这之前我们先看一下go中提供了哪些关于error的方法:
简单看一下Join()的源码:
func Join(errs ...error) error {
n := 0
for _, err := range errs {
if err != nil { //如果传进来的err不是 nil
n++//n自增
}
}
if n == 0 {
return nil
}
e := &joinError{
errs: make([]error, 0, n),
}
for _, err := range errs {
if err != nil {
e.errs = append(e.errs, err)
}
}
return e
}
简单来讲就是err的拼接
func main() {
r, err := errorR(121)
if err!=nil {
fmt.Println(err)
fmt.Printf("err的类型%T\n",err)
}else {
fmt.Println(r)
}
}
func errorR(age int) (string, error) {
if age < 0 || age > 120 {
err := fmt.Errorf("输入的年龄%d不符合统计要求", age)
return "", err
} else {
str := "您输入的年龄" + strconv.FormatInt(int64(age), 10) + "符合要求"
return str, nil
}
}
自定义错误
自定义错误的实现步骤如下。
- • 定义一个结构体,表示自定义错误的类型。
- • 让自定义错误类型实现error接口:Error()string。
- • 定义一个返回error的函数。根据程序实际功能而定。
代码demo
//定义结构体
type errorDefine struct {
reason string
}
//实现Error()方法
func (e errorDefine)Error()string {
return "除数为0,不符合要求/"+e.reason
}
func Divide2(a,b int)(float64,error){
defineerr := errorDefine{reason: "by Zero"}
if b==0{
return -1,defineerr
}else{
return float64(a / b),nil
}
}
func main() {
divide2, err := Divide2(100, 0)
if err!=nil {
fmt.Println(err)
}else {
fmt.Println(divide2)
}
}