Go 语言中的错误处理是把错误当成一种值来处理,更强调判断错误、处理错误,而不是用 catch 捕获异常
1 异常抛出与处理
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()
}
2 返回并处理错误
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)
}
}
3 Error 接口
3.1 error接口类型
Go 语言中使用一个名为 error
接口来表示错误类型。
type error interface {
Error() string
}
error
接口只包含一个方法——Error
,这个函数需要返回一个描述错误信息的字符串。
当一个函数或方法需要返回错误时,我们通常是把错误作为最后一个返回值
由于 error 是一个接口类型,默认零值为nil
。所以我们通常将调用函数返回的错误与nil
进行比较,以此来判断函数是否返回错误
3.2 创建错误
我们可以根据需求自定义 error,最简单的方式是使用errors
包提供的New
函数创建一个错误。
errors.New
func New(text string) error
它接收一个字符串参数返回包含该字符串的错误。我们可以在函数返回时快速创建一个错误
if radius <= 0 {
return 0, errors.New("半径不能小于0")
}
4 自定义错误
只要实现了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)
}
}