go语言中使用error接口处理异常,两个内置函数panic()和recover()以报告和处理运行时错误和程序中的错
误场景,一个defer关键字来处理顺序执行。
一、error异常处理
01、error接口
go语言使用接口error处理异常。
type error interface {
Error() string
}
该接口处于errors包下,只有以下内容:
package errors
func New(text string) error { return &errorString{text} }
type errorString struct { text string }
func (e *errorString) Error() string { return e.text }
02、New()函数
可以直接使用New函数定义一个错误数据:
func main() {
i,err:=walk(5)
if err==nil{
fmt.Println(i)
}
l,err:=walk(10)
if err==nil{
fmt.Println(l)
}
fmt.Println(err)
}
func walk(i int)(s string,err error){
if i<10{
return "ok",nil
}
return "no",errors.New("this is false")
}
//ok
//this is false
03、fmt.Errorf()函数
调用 errors.New 函数是非常稀少的,因为有一个方便的封装函数 fmt.Errorf,它还会处理字符串格式化。
package fmt
import "errors"
func Errorf(format string, args ...interface{}) error {
return errors.New(Sprintf(format, args...))
}
如下:
func main() {
errs:=run("hello")
if errs!=nil{
fmt.Println(errs)
}
}
func run(s string)error{
if len(s)<8{
return fmt.Errorf("错误,%v数据长度过短",s)
}
fmt.Println("ok")
return nil
}
//错误,hello数据长度过短
二、defer关键字
defer 关键字将语句延迟执行,在defer所在的函数即将返回或者说结束时,将defer语句执行。
如果有多个被defer修饰的语句,那么以栈(后进先出)的方式执行,即逆序执行。
func main() {
//defer关键字用于延迟执行
fmt.Println("Start do ..")
defer hello(1)
defer hello(2)
defer hello(3)
fmt.Println("End do..")
}
func hello(i int){
fmt.Println("Hello",i)
defer ok(7)//在函数结束前执行
fmt.Printf("hello%d函数结束啦
",i)
return
}
func ok(i int) {
fmt.Println("yes",i)
}
主函数执行完毕即将结束时,hello()函数从hello(3)开始执行,在hello(3)即将结束时执行ok(7),然后hello(2),hello(1)按照顺序逆序执行。
Start do ..
End do..
Hello 3
hello3函数结束啦
yes 7
Hello 2
hello2函数结束啦
yes 7
Hello 1
hello1函数结束啦
yes 7
三、panic()、recover()函数
Go语言引入了两个内置函数panic()和recover()以报告和处理运行时错误和程序中的错 误场景:
func panic(interface{})
func recover() interface{}
01、panic()
当在一个函数执行过程中调用panic()函数时,正常的函数执行流程将立即终止,但函数中 之前使用defer关键字延迟执行的语句将正常展开执行,错误信息将被报 告,包括在调用panic()函数时传入的参数,这个过程称为错误处理流程。
func main() {
defer fmt.Println("宕机也要执行的语句")
defer fmt.Println("宕机之前的defer语句仍然执行")
panic("错误,宕机")
defer fmt.Println("宕机之前的语句不再执行")
fmt.Println("no........")
}
宕机之前的defer语句仍然执行
宕机也要执行的语句
panic: 错误,宕机
goroutine 1 [running]:
main.main()
E:/GoProject/aone/src/panicdemo.go:10 +0x147
Process finished with exit code 2
02、recover()
recover()函数用于终止错误处理流程。一般情况下,recover()应该在一个使用defer
关键字的函数中执行以有效截取错误处理流程。
func main() {
defer func() {
err:=recover()
fmt.Println("捕获数据:",err)
}()
defer fmt.Println("宕机也要执行的语句")
defer fmt.Println("宕机之前的defer语句仍然执行")
panic("错误,宕机")
fmt.Println("no........")
}
宕机之前的defer语句仍然执行
宕机也要执行的语句
捕获数据: 错误,宕机