很多的编程语言,对 函数 出现错误的情况,或者发生意想不到的情况都会有对应的处理方式,最常用的就是通过异常的方式来处理。
但是,在 Go 语言 中,没有类似的异常处理机制,我们知道 Go 语言的函数可以 返回多个值,因此,在 golang 中,一般处理函数异常的方式,是通过返回值返回错误的形式。
func funcName(param paramType)(returnVal1 returnType, err error){
// do something
}
我们定义了一个函数 funcName,该函数传递一个 参数,该函数的返回值有两个,第一个是 returnType 类型,第二个是 error 类型。
如果我们的函数错误,那么就可以给 err 赋值,返回错误信息,否则就将 err 设置为 nil 返回即可。最后,我们在调用函数时,判断 err 是否为空即可。
我们列举几个系统中,使用异常处理的函数,比如 golang 中,打开文件的函数,如下:
func Open(name string) (*File, error) {
}
我们看到,这个函数接受一个 string 类型 的参数,返回一个 File 类型的返回值和一个 error 类型的返回值。如果文件打开出错,那么就会给 error 设置对应的错误信息。再比如,golang 中的网络连接的函数,如下:
func Dial(network, address string) (Conn, error){
}
该函数,同样返回了两个值,第一个值是 Conn 类型,第二个同样是 error 类型的,如果网络连接出错,那么就会给 error 设置对应的错误信息。
函数返回错误信息
package main
import (
"errors"
"fmt"
)
// 定义除数为0的错误
var errDiv = errors.New("division by zero")
func div(dividend, divisor int) (int, error) {
// 判断除数为0的情况并返回
if divisor == 0 {
return 0, errDiv
}
// 正常计算,返回空错误
return dividend / divisor, nil
}
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
// 函数返回错误信息
if ret, err := div(2, 0); err != nil{
fmt.Println("Div err, Err =", err)
}else{
fmt.Println("Div ok, Ret =", ret)
}
}
程序运行后,控制台输出如下:
首先,我们通过 errors.New 定义了一个除数为 0 的错误。接着,我们在 div 函数中在做真正的计算之前,首先使用 if 语句 判断,如果除数为 0,那么就返回 0 和 定义的错误,否则,就返回正常的商,错误返回 nil。
在 main() 函数,调用我们自定义的函数 div 时,我们使用两个变量接受返回值,一个是商一个是错误信息,如果错误信息不是 nil,那么就表明处理出错,忽略返回值的处理,否则,就表明函数返回正常。
在 golang 中,一般处理函数异常的方式,是通过返回值返回错误的形式。