作者:看那个码农
公众号:看那个码农
上期内容介绍了Go语言学习之&和 *区别|Go主题月
- 什么是“&”
- 什么是“*”
- “&”与“*”相结合使用的案例
本篇内容将继续带领大家走进Go语言的世界。
1.本文简介
Go语言学习之处理错误
2.什么是处理错误
程序软件在运行过程中不可避免地会有错误及遇到未考虑地异常情形,很多语言选择在必须捕获的错误时会引发异常,而Go语言处理错误的方式,则是将错误作为一种类型。
例如下面案例所示,我们编写一个简单的程序,该程序试图打开一个不存在的文件:
package main
import (
"fmt"
"os"
)
func main() {
f, error := os.Open("/test.txt")
if error != nil {
fmt.Println("error:",error)
return
}
fmt.Println(f.Name(), "open successfully")
}
输出为:
可以看到我们的程序调用了os包的Open方法,该方法定义如下:
// Open opens the named file for reading. If successful, methods on
// the returned file can be used for reading; the associated file
// descriptor has mode O_RDONLY.
// If there is an error, it will be of type *PathError.
func Open(name string) (*File, error) {
return OpenFile(name, O_RDONLY, 0)
}
参考注释可以知道
- 如果这个方法
正常返回的话会返回一个可读的文件句柄和一个值为nil的错误。 - 如果该方法
未能成功打开文件会返回一个*PathError类型的错误。
如果一个函数或方法返回了错误,按照Go语言的惯例,错误会作为最后一个值返回。
Open函数也是将err作为最后一个返回值返回。
在Go语言中,处理错误时通常都是将返回的错误与 nil 比较。
nil值表示没有错误发生,非 nil值表示出现了错误。于是有个我们上面那行代码:
if error != nil {
fmt.Println("error:",error)
return
}
3.理解错误类型
在Go语言中,错误是一个值。通过内置的错误接口提供了非常简单的错误处理机制。
如下面案例所示:
type error interface {
Error() string
}
这个接口只有一个方法Error,方法Error返回一个字符串。
4.创建错误
4.1 标准库中的errors支持创建和操作错误
具体案例实现如下:
package main
import (
"errors"
"fmt"
)
func main() {
err := errors.New("Something went wrong!")
if err != nil{
fmt.Println(err)
}
}
输出为:
4.2 Errorf方法
除了刚才提到的errors包外,标准库中还提供了Errorf方法,用于设置返回错误字符串的格式。
如下面的案例所示:
package main
import (
"fmt"
)
func main() {
node1,node2 := "Ben","Jane"
err := fmt.Errorf("%v and %v out ",node1,node2)
if err!=nil{
fmt.Println(err)
}
}
输出为:
4.3 设置自定义错误
自定义错误的设置和使用流程,如下面的案例所示:
package main
import (
"errors"
"fmt"
)
//一个包裹了错误类型对象的自定义错误类型
type MyError struct {
err error
}
//订制Error()
func (e MyError) Error() string {
return e.err.Error()
}
func main() {
err:=MyError{
errors.New("hello error"),
}
fmt.Println(err.Error())
}
输出为:
5.从函数中返回错误
案例一:奇数偶数判断
package main
import "fmt"
func Half(number int)(int, error){
if number %2 !=0{
return -1,fmt.Errorf("Cannot half %v",number)
}
return number/2,nil
}
func main() {
n,err:=Half(20)
if err!=nil{
fmt.Println(err)
return
}
fmt.Println(n)
}
输出为:
在上述案例中,函数Half用来检查输入值20是否为偶数,
- 如果不为
偶数,函数Half返回-1,和一个错误值。 - 如果为
偶数,函数Half返回输入偶数的一半。
案例二:计算圆面积的简单程序
- 如果半径为
负,它会返回一个错误。 - 如果半径为
正,它会返回一个由半径创建的圆面积。
代码如下:
package main
import (
"errors"
"fmt"
"math"
)
func circleArea(radius float64) (float64, error) {
if radius < 0 {
return 0, errors.New("Area calculation failed, radius is less than zero")
}
return math.Pi * radius * radius, nil
}
func main() {
var radius float64
fmt.Println("请输入圆的半径:")
fmt.Scan(&radius)
area, err := circleArea(radius)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Area of circle %0.2f", area)
}
输出为:
如果圆的半径为负:
如果你觉得这篇内容对你有帮助的话:
1、点赞支持下吧,让更多的人也能看到这篇内容
2、关注公众号:看那个码农,我们一起学习一起进步。