赞
踩
(1)我们来写一个错误
package main import "fmt" func main() { test() fmt.Println("上面的除法操作执行成功...") fmt.Println("正常执行下面的逻辑...") } func test() { num1 := 10 num2 := 0 result := num1 / num2 //第13行 fmt.Println(result) }
我们来运行一下,结果如图:

意思是(死机:运行时错误:整数被零除)
发现:程序中出现错误/恐慌以后,程序被中断,无法继续执行。
(2)错误处理/捕获机制
GO中追求代码优雅,引入机制:defer+recover机制处理错误 。
内置函数recover:
func recover() interface{}
内建函数recover允许程序管理恐慌过程中的GO程。在defer的函数中,执行recover调用会取回传至panic调用的错误值,恢复正常执行,停止恐慌过程。若recover在defer的函数之外被调用,它将不会停止恐慌过程序列。在此情况下,或当该Go程不在恐慌过程中时,或提供给panic的实参为nil时,recover就会返回nil。
package main import "fmt" func main() { test() fmt.Println("上面的除法操作执行成功...") fmt.Println("正常执行下面的逻辑...") } func test() { //利用defer+recover来捕获错误:defer后加上匿名函数的调用 defer func() { //调用recover内置函数,可以捕获错误: err := recover() //如果没有捕获错误,返回值为零值:nil if err != nil { fmt.Println("捕获到错误") fmt.Println("err是:", err) } }() num1 := 10 num2 := 0 result := num1 / num2 fmt.Println(result) }

优点:提高程序健壮性
自定义错误:需要调用errors包下的New函数:函数返回error类型
func New(text string) error
使用字符串创建一个错误,请类比fmt包的Errorf方法,差不多可以认为是New(fmt.Sprintf(…))。
package main import ( "errors" "fmt" ) func main() { err := test() if err != nil { fmt.Println("自定义错误:", err) } fmt.Println("上面的除法操作执行成功...") fmt.Println("正常执行下面的逻辑...") } func test() (err error) { num1 := 10 num2 := 0 if num2 == 0 { //抛出自定义错误: return errors.New("除数不能为0喔") } else { //如果除数不为0,那么正常执行就可以了 result := num1 / num2 fmt.Println(result) //如果没有错误,返回零值: return nil } }
运行结果:

有一种情况:程序出现错误以后,后续代码就没有必要执行,想让程序中断,退出程序:
借助:builtin包下内置函数:panic
func panic(v interface{})
内建函数panic停止当前Go程的正常执行。当函数F调用panic时,F的正常执行就会立刻停止。F中defer的所有函数先入后出执行后,F返回给其调用者G。G如同F一样行动,层层返回,直到该Go程中所有函数都按相反的顺序停止执行。之后,程序被终止,而错误情况会被报告,包括引发该恐慌的实参值,此终止序列称为恐慌过程。
package main import ( "errors" "fmt" ) func main() { err := test() if err != nil { fmt.Println("自定义错误:", err) panic(err) } fmt.Println("上面的除法操作执行成功...") fmt.Println("正常执行下面的逻辑...") } func test() (err error) { num1 := 10 num2 := 0 if num2 == 0 { //抛出自定义错误: return errors.New("除数不能为0喔") } else { //如果除数不为0,那么正常执行就可以了 result := num1 / num2 fmt.Println(result) //如果没有错误,返回零值: return nil } }
运行结果:

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。