非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第10章 错误处理
- 10.5 Go语言错误的应用
- 10.6 小结
- 10.7 知识拓展
- 10.7.1 error接口的应用
第10章 错误处理
10.5 Go语言错误的应用
10.4.2小节中的panic()和recover()虽然能模拟其他语言的异常机制,但是并不建议在Go语言编程中使用类似的方法。
正如这章开头所提到的,推荐使用多值返回来返回错误。
[ 动手写 10.5.1]
package main
import (
"errors"
"fmt"
)
func div(dividend int, divisor int) (int, error) {
if divisor == 0 { // 除数为0则返回错误
return 0, errors.New("divisor is zero")
}
return dividend / divisor, nil
}
func main() {
res1, err := div(4, 2)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("4/2 = ", res1)
}
res2, err := div(1, 0)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("1/0 = ", res2)
}
}
运行结果
10.6 小结
- 在Go语言中使用多值返回来返回错误。
- Go语言的error类型实际上是一个接口,error接口包含Error方法,用来返回一个字符串。
- Go语言标准库中的errors包可以用来创建错误,自定义错误内容。
- 标准库中的fmt包提供了Errorf方法,用来设置返回错误内容的格式。
- 一般而言,只有当程序发生不可逆的错误时,才会使用panic方法来触发宕机。
- Go语言通过内置函数recover来捕获宕机,类似于其他编程语言中的try-catch机制。
10.7 知识拓展
10.7.1 error接口的应用
在“10.2自定义错误”一节中,我们通过Go语言标准库中errors包的New方法来创建自定义错误。
那么,除了通过这种方法,是否还可通过其他方法来创建自定义错误呢?答案是肯定的。
Go语言的error类型实际上是一个接口,定义如下:
type error interface {
Error() string
}
那么,只要我们自定义一个类型,且该类型实现了Error方法,它就实现了error接口。
以计算一个数的算术平方根为例,被开方数必须是非负数,自定义类型如下:
type ErrNegSqrt float64
需实现Error函数,返回自定义错误信息:
func (e ErrNegSqrt) Error() string{
return fmt.Sprintf("cannot Sqrt negative number: %v",float64(e))
}
计算算术平方根函数如下,对于被开方数为负数的情况抛出错误:
func sqrt(x float64) (float64, error) {
if x<0.0{
return 0, ErrNegSqrt(x)
}else {
return math.Sqrt(x),nil
}
}
程序源代码如下:
[ 动手写10.7.1]
package main
import (
"fmt"
"math"
)
type ErrNegSqrt float64
func (e ErrNegSqrt) Error() string {
return fmt.Sprintf("Cannot Sqrt negative number : %v ", float64(e))
}
func sqrt(x float64) (float64, error) {
if x < 0.0 {
return 0, ErrNegSqrt(x)
} else {
return math.Sqrt(x), nil
}
}
func main() {
res, err := sqrt(-2)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(res)
}
}
运行结果
当然接口这个东西后面还会细说