Go语言error接口教程

一般程序设计语言中的错误处理分为两种情况,即错误和异常。在 中,错误处理一般都是通过 error 来指定。

因为 Golang 中的 可以 ,因此,一般,Go语言中的函数的最后一个返回值,都是一个 error 接口 的 ,表明这个函数有没有出错。

如果我们需要自定义错误类型,那么我们只需要实现 error 接口中的 Error 方法即可。

Go语言error接口

定义

type error interface { Error() string }

说明

error 接口有一个签名为 Error() 的方法,所有实现该接口的类型都可以当作一个错误类型。Error() 方法给出了错误的描述,在打印错误时,会在内部调用 Error() string 方法来得到该错误的描述。

Go语言error创建

语法

errors.New("error info")

说明

我们直接通过 errors.New 传入错误的描述信息,就可以创建一个 error 接口类型的变量。

Go语言函数返回error

语法

func funcHandler(param1 paramtyp1, ...)(returnType1, ..., error){ }

说明

我们定义了一个函数 funcHandler,该函数的最后一个返回值是一个 error 接口类别的变量,如果该函数出错,那么我们就可以给最后一个 设置值。

案例

函数返回error信息

定义函数时,通过 error,返回错误信息

package main import ( "errors" "fmt" ) // 定义函数时,通过 error,返回错误信息 func div(num1, num2 int)(int, error){ if num2 == 0{ return 0, errors.New("div 0") } return num1 / num2, nil } func main() { fmt.Println("嗨客网(www.haicoder.net)") var num1 int = 1024 var num2 int = 8 var num3 int = 0 if result1, err1 := div(num1, num2); err1 != nil{ fmt.Println("Div error, errInfo =", err1.Error()) }else{ fmt.Println("Div ok, result =", result1) } if result2, err2 := div(num1, num3); err2 != nil{ fmt.Println("Div error, errInfo =", err2.Error()) }else{ fmt.Println("Div ok, result =", result2) } }

程序运行后,控制台输出如下:

23_golang error接口.png

首先,我们定义了一个函数 div,该函数接受两个 的 ,并返回一个 int 类型的返回值和一个 error 接口类型的返回值。

该函数的功能是实现计算两个 int 类型参数的除法,并且在函数中使用 判断,如果除数为 0,那么我们就通过 errors.New 方法返回一个错误信息。

最后,在 函数,调用该 div 函数时,我们通过判断函数的第二个参数是否为 nil,来判断计算是否成功,如果没有成功,我们可以通过 err.Error 方法,得到错误的具体信息。

自定义错误类型

通过实现 Error 方法,来自定义错误类型

package main import ( "fmt" ) // 通过实现 Error 方法,来自定义错误类型 type divError struct { Num int errInfo string } func (e divError) Error() string { return fmt.Sprintf("Div Error, Num is invalid, Num = %d", e.Num) } func div(num1, num2 int)(int, error){ if num2 == 0{ return 0, divError{Num:num2} } return num1 / num2, nil } func main() { fmt.Println("嗨客网(www.haicoder.net)") var num1 int = 1024 var num2 int = 8 var num3 int = 0 if result1, err1 := div(num1, num2); err1 != nil{ fmt.Println("Div error, errInfo =", err1.Error()) }else{ fmt.Println("Div ok, result =", result1) } if result2, err2 := div(num1, num3); err2 != nil{ fmt.Println("Div error, errInfo =", err2.Error()) }else{ fmt.Println("Div ok, result =", result2) } }

程序运行后,控制台输出如下:

24_golang error接口.png

首先,我们定义了一个 divError 的 ,该结构体含有两个成员,一个 int 类型的 Num,一个 string 类型的 errInfo。

接着,我们为该结构体添加了 Error 方法,Error 方法返回一个 string 类型的返回值。因此,我们可以说 divError 实现了 Error 接口。

接着,我们定义了一个函数 div,该函数接受两个 int类型的参数,并返回一个 int 类型的返回值和一个 error 接口类型的返回值。

该函数的功能是实现计算两个 int 类型参数的除法,并且在函数中使用 if 判断,如果除数为 0,那么我们就通过 我们刚定义的 divError 返回一个错误信息。

最后,在 main 函数,调用该 div 函数时,我们通过判断函数的第二个参数是否为 nil,来判断计算是否成功,如果没有成功,我们可以通过 err.Error 方法,得到错误的具体信息。

Golang error接口总结

因为 Golang 中的函数可以返回多个值,因此,一般,Go 语言中的函数的最后一个返回值,都是一个 error 接口 类型的变量,表明这个函数有没有出错。

如果我们需要自定义错误类型,那么我们只需要实现 error 接口中的 Error 方法即可。