本文最后更新于201 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
defer+recover错误回收
示例:
程序中出现错误/恐慌后程序被中断无法执行
package main
import "fmt"
func main() {
kkk()
fmt.Println("上面函数已经成功执行")
}
func kkk() {
num1 := 2
num2 := 0
num3 := num1 / num2
fmt.Println(num3)
}
使用defer+recover错误回收处理:
func recover
func recover() interface{}
内建函数recover允许程序管理恐慌过程中的Go程。在defer的函数中,执行recover调用会取回传至panic调用的错误值,恢复正常执行,停止恐慌过程。若recover在defer的函数之外被调用,它将不会停止恐慌过程序列。在此情况下,或当该Go程不在恐慌过程中时,或提供给panic的实参为nil时,recover就会返回nil。
package main
import "fmt"
func main() {
kkk()
fmt.Println("上面函数已经成功执行")
}
func kkk() {
defer func() { //defer+recover来捕获错误
if err := recover(); err != nil {
//调用recover来捕获错误
fmt.Println("err是", err)
fmt.Println("错误已被捕获")
}
}()
num1 := 2
num2 := 0
num3 := num1 / num2
fmt.Println(num3)
}
自定义错误
自定义错误使用到函数
func New
func New(text string) error
使用字符串创建一个错误,请类比fmt包的Errorf方法,差不多可以认为是New(fmt.Sprintf(...))。
package main
import (
"errors"
"fmt"
)
func main() {
err := kkk()
if err != nil {
fmt.Println(err)
}
fmt.Println("上面函数已经成功执行")
}
func kkk() (err error) {
num1 := 2
num2 := 0
if num2 == 0 {
return errors.New("除数不能为零")
} else {
num3 := num1 / num2
fmt.Println(num3)
return nil
}
}