Go语言error接口:返回错误信息
在C语言中通过返回 -1 或者 NULL 之类的信息来表示错误,但是对于使用者来说,如果不查看相应的 API 说明文档,根本搞不清楚这个返回值究竟代表什么意思,比如返回 0 是成功还是失败?
针对这样的情况,Go语言中引入 error 接口类型作为错误处理的标准模式,如果函数要返回错误,则返回值类型列表中肯定包含 error。error 处理过程类似于C语言中的错误码,可逐层返回,直到被处理。
error 基本用法
Go语言中返回的 error 类型究竟是什么呢?查看Go语言的源码就会发现 error 类型是一个非常简单的接口类型,如下所示:error 接口有一个签名为 Error() string 的方法,所有实现该接口的类型都可以当作一个错误类型。Error() 方法给出了错误的描述,在使用 fmt.Println 打印错误时,会在内部调用 Error() string 方法来得到该错误的描述。// 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 最简单的方法就是调用 errors.New 函数,它会根据传入的错误信息返回一个新的 error,示例代码如下:
package main
import (
"errors"
"fmt"
"math"
)
func Sqrt(f float64) (float64, error) {
if f < 0 {
return -1, errors.New("math: square root of negative number")
}
return math.Sqrt(f), nil
}
func main() {
result, err := Sqrt(-13)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(result)
}
}
运行结果如下:
math: square root of negative number
上面代码中简单介绍了使用 errors.New 来返回一个错误信息,与其他语言的异常相比,Go语言的方法相对更加容易、直观。自定义错误类型
除了上面的 errors.New 用法之外,我们还可以使用 error 接口自定义一个 Error() 方法,来返回自定义的错误信息。package main
import (
"fmt"
"math"
)
type dualError struct {
Num float64
problem string
}
func (e dualError) Error() string {
return fmt.Sprintf("Wrong!!!,because \"%f\" is a negative number", e.Num)
}
func Sqrt(f float64) (float64, error) {
if f < 0 {
return -1, dualError{Num: f}
}
return math.Sqrt(f), nil
}
func main() {
result, err := Sqrt(-13)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(result)
}
}
运行结果如下:
Wrong!!!,because "-13.000000" is a negative number
- 随机文章
- 武汉 马尔代夫(武汉居民马尔代夫 旅游:惬意悠闲海岛之旅)
- 印度 马尔代夫 地图(印度与马尔代夫地图重合,引发政治纠纷。)
- 情侣 马尔代夫 对话(情侣在马尔代夫畅谈心事)
- 云和马尔代夫攻略(探寻天堂之旅:云和马尔代夫岛屿攻略)
- 中国-马尔代夫直播(中马直播:探秘海上新丝路)
- 马尔代夫高脚木屋(重建后的马尔代夫高脚木屋惊艳亮相)
- 广西马尔代夫国家(广西打造自然的马尔代夫风情旅游胜地)
- 成都 马尔代夫 2023(成都将在2023年建设马尔代夫式度假村)
- 上海 马尔代夫 东航(东航开通上海至马尔代夫航班,打造浪漫海岛之旅)
- 平潭马尔代夫岛屿(福建平潭开发区将建马尔代夫度假岛屿)
- 宜昌马尔代夫风景(宜昌变身马尔代夫!赏清澈水下世界!)
- 暑假马尔代夫机票(如何在暑假预算内买到马尔代夫机票?)
- 插画马尔代夫图片(瑰丽马尔代夫:浪漫之旅的完美目的地)
- 无签证去马尔代夫(无签证也能畅游马尔代夫,全攻略来袭)
- 沙滩 马尔代夫(马尔代夫白色沙滩闪耀太阳光线)
- 泰国马尔代夫美女(泰国与马尔代夫的美女,哪里更美丽?)
- 最新马尔代夫简介(新马尔代夫简介:印度洋上的度假天堂)
- 成都 马尔代夫(成都新贵们的新宠--马尔代夫)
- 雨季 马尔代夫(马尔代夫迎来雨季,岛屿充满生机)
- 江心洲的马尔代夫(江心洲集团入驻马尔代夫,开启新篇章)
- 澳门马尔代夫旅游(澳门和马尔代夫的旅游攻略和美食推荐)
- 台湾 马尔代夫(台湾游客赴马尔代夫旅游实名登记 成为必经程序)
- 陪你去看马尔代夫(带你探秘马尔代夫,尽享美丽沙滩之旅)
- 重庆出发马尔代夫(重庆直飞马尔代夫,亲临梦幻海底世界)
- 马尔代夫中国全场(马尔代夫中资企业多途径支持当地发展)
- 马尔代夫出海潜水(探秘马尔代夫海底世界,开启潜水之旅)
- 马尔代夫变垃圾岛(马尔代夫成功将垃圾岛变成海洋保护区)
- 长治马尔代夫去处(长治人最爱的马尔代夫必去旅游胜地!)
- 赣西马尔代夫现状(赣西马尔代夫:海上旅游胜地重回正轨)
- 马尔代夫啤酒推荐(推荐:马尔代夫当地最值得品尝的啤酒)
