go errors
错误表示程序中出现了异常情况。比如当我们试图打开一个文件时,文件系统里却并没有这个文件。这就是异常情况,它用一个错误来表示。
在 Go 中,错误一直是很常见的。错误用内建的 error
类型来表示。
就像其他的内建类型(如 int
、float64
等),错误值可以存储在变量里、作为函数的返回值等等。
Go 语言中的错误处理是把错误当成一种值来处理,返回出去,谁调用我,谁处理,更强调判断错误、处理错误,而不是像python中用try-except 捕获异常
异常抛出与处理
异常抛出与处理 参考 go panic 与 recover
package main
import "fmt"
func slicePanic() {
var s =[]int{4,5,6}
fmt.Println(s[9])
}
func getCircleArea(radius float32)float32{
if radius<=0{
panic("半径不能为0") // 抛出错误
}
return 3.14*radius*radius
}
func recoverSlicePanic() {
defer func() {
if err:=recover();err!=nil{
fmt.Println(err)
}
}()
slicePanic()
}
func recoverGetCircleArea(){
defer func() {
if err:=recover();err!=nil{
fmt.Println(err)
}
}()
getCircleArea(-9)
}
func main() {
//1 系统抛出异常
//slicePanic()
//2 用户抛出异常
//res:=getCircleArea(-2)
//fmt.Println(res)
// 3 处理系统抛出异常
//recoverSlicePanic()
// 4 处理用户抛出异常
recoverGetCircleArea()
}
返回并处理错误
当然, 上述方法并不是go中推荐使用的。go 把错误当作参数返回的方法更推荐如下方法:也是目前用的最多的一种方法。
package main
import (
"errors"
"fmt"
)
// 返回错误
func getCircleArea(radius float32) (float32, error) {
if radius <= 0 {
return 0, errors.New("半径不能小于0")
}
return 3.14 * radius * radius, nil
}
func main() {
res,err:=getCircleArea(9)
if err != nil {
fmt.Println(err)
}else {
fmt.Println("圆的面积为",res)
}
}
Error 接口
error接口类型
Go 语言中使用一个名为 error
接口来表示错误类型。
type error interface {
Error() string
}
error
接口只包含一个方法——Error
,这个函数需要返回一个描述错误信息的字符串。
当一个函数或方法需要返回错误时,我们通常是把错误作为最后一个返回值
由于 error 是一个接口类型,默认零值为nil
。所以我们通常将调用函数返回的错误与nil
进行比较,以此来判断函数是否返回错误
创建错误两种方式
我们可以根据需求自定义 error,最简单的方式是使用errors
包提供的New
函数创建一个错误。除此之外还可以通过fmt
包下的 fmt.Errof
创建错误
errors.New
func New(text string) error
它接收一个字符串参数返回包含该字符串的错误。我们可以在函数返回时快速创建一个错误
func getCircleArea(radius float32) (float32,error) {
if radius <= 0 {
err := errors.New("半径不能小于0,您的半径是:`radius`") // 生产error对象
return 0, err
}
return 3.14 * radius * radius,nil
}
func main() {
res,err := getCircleArea(-2)
if err != nil{
fmt.Println(err.Error()) // 输出error信息
return
}
fmt.Println(res)
}
fmt.Errof
fmt.Errof
创建错误相比errors.New
方式 ,能格式化字符串输出信息。但是用的少
func getCircleArea(radius float32) (float32,error) {
if radius <= 0 {
err := fmt.Errorf("半径不能小于0,您的半径是:%v", radius)
return 0, err
}
return 3.14 * radius * radius,nil
}
func main() {
res,err := getCircleArea(-2)
if err != nil{
fmt.Println(err.Error()) // 输出error信息
return
}
fmt.Println(res)
}
自定义错误
只要实现了error接口中的Error方法,就叫实现该接口,就是我们自定义的错误
package main
import (
"fmt"
)
type radiusError struct {
radius string
}
func (r *radiusError)Error()string {
return "出现错误,错误原因为:"+r.radius
}
func getCircleArea(radius float32) (float32, error) {
if radius <= 0 {
return 0, &radiusError{radius:"半径不能小于0",}
}
return 3.14 * radius * radius, nil
}
func main() {
res,err:=getCircleArea(-9)
if err != nil {
fmt.Println(err)
}else {
fmt.Println("圆的面积为",res)
}
}