error
Go中的错误也是一种类型,错误用内置的error类型表示,error是一种接口类型,错误的值可以存在变量中
如果一个函数或方法返回一个错误,那个按照惯例,它必须是函数返回的最后一个值
处理错误的管用方法是将返回的错误与nil进行比较,nil值表示没发生错误,反之有错误
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Open("test.txt")
if err != nil{
//log.Fatal(err)
fmt.Println(err)
//通过类型断言获取错误类型中的字段信息
if ins,ok := err.(*os.PathError);ok{
fmt.Println(ins.Op)
fmt.Println(ins.Err)
fmt.Println(ins.Path)
}
return
}
name := file.Name()
fmt.Println(name)
}
错误类型表示
error是一个带有Error()方法的接口类型
type error interface{
Error() string
}
它包含一个带有Error()字符串的方法,任何实现这个接口的类型都可以作为一个错误使用,这个方法提供了对错误的描述
如fmt.Println函数在内部调用Error()方法来获取错误描述,将错误打印出来
创建错误的方式
1.errors包
err := errors.New("自定义错误")
2.fmt包
err2 := fmt.Errorf("自定义错误%d", 404)
案例
package main
import (
"errors"
"fmt"
)
func main() {
err1 := errors.New("自定义错误1")
fmt.Println(err1)
fmt.Printf("%T\n",err1) // *errors.errorString
err2 := fmt.Errorf("自定义错误%d", 404)
fmt.Println(err2)
fmt.Printf("%T\n",err2) // *errors.errorString
}
函数返回错误类型
package main
import (
"errors"
"fmt"
)
func main() {
//案例
err := checkAge(-10)
if err != nil{
fmt.Println(err)
}
}
func checkAge(age int) error {
if age < 0{
err := errors.New("年龄不合法")
return err
}
fmt.Println("年龄是:",age)
return nil
}
自定义错误类型
package main
import (
"fmt"
"math"
)
func main() {
//求圆的面积
//var r = 3.0
var r = -3.0
area, err := circleArea(r)
if err != nil{
fmt.Println(err)
return
}
fmt.Println(area)
}
//1.定义一个结构体,表示错误的信息
type areaError struct {
msg string
radius float64
}
//2.结构体实现error接口中的Error方法
func (e *areaError) Error() string {
return fmt.Sprintf("error:半径是%.2f,%s",e.radius,e.msg)
}
func circleArea(radius float64) (float64,error) {
if radius < 0{
return 0,&areaError{"半径非法",radius}
}
return math.Pi *radius * radius, nil
}
panic
panic使程序抛出错误,终止运行
若函数中有panic与defer,在panic之前的defer会执行,panic之后的defer不执行
package main
import "fmt"
func main() {
test()
}
func test() {
defer fmt.Println("test() 001")
for i:=0; i<=5;i++ {
fmt.Println(i)
if i == 3{
panic("错误,恐慌")
}
}
defer fmt.Println("test() 002")
}
>>>:
test() 001
panic: 错误,恐慌
recover
用来捕获panic,是程序继续运行,recover返回的是panic中的内容
package main
import "fmt"
func main() {
defer fmt.Println("main() 001")
test()
defer fmt.Println("main() 002")
}
func test() {
defer fmt.Println("test() 001")
defer func() {
if msg := recover();msg!=nil{
fmt.Println(msg,"程序恢复执行")
}
}()
for i:=0; i<=5;i++ {
fmt.Println(i)
if i == 3{
panic("错误,恐慌")
}
}
defer fmt.Println("test() 002")
}
>>>:
0
1
2
3
错误,恐慌 程序恢复执行
test() 001
main() 002
main() 001