错误处理 #
go内置错误类型接口,在builtin包中(接口名为error):
type error interface {
Error() string
}
声明error接口类型变量:
格式: var 变量名 error
示例: var err error
在errors包中提供返回error接口类型的方法:
func New(text string) error
自定义错误并返回error接口类型:
err := errors.New("错误信息") //返回error接口类型,
//等价 var err error = errors.New("错误信息")
errMsg := err.Error() //获取错误信息
fmt.Println(errMsg) //打印错误信息 "错误信息"
返回error对象的几种方式如下:
1. err := errors.New("错误信息") //返回error接口类型
2. func Errorf(format string, a ...interface{}) error 返回error接口类型
err := fmt.Errorf("格式化字符串%s", 可选参数1, 可选参数N)
获取错误信息: errMsg := error接口类型对象变量.Error()
errors包支持的方法 #
package errors
func New(text string) error {
return &errorString{text}
}
type errorString struct {//本包可见的结构体
s string
}
func (e *errorString) Error() string {//为结构体增加方法
return e.s
}
以上说明对外只抛出New方法并返回error类型对象
error示例1 #
1. 自定义error错误
func myErr(msg string) error {
var err error = errors.New(msg)
return err
}
2. 使用
errMsg := myErr("发生xxx异常")
if(errMsg != nil) {
fmt.Println(errMsg) //发生xxx异常
}
error示例2 #
const name, id = "admin", 100
err := fmt.Errorf("user %q (id %d) not found", name, id) //返回error接口类型
if err != nil {
fmt.Print(err) //user "admin" (id 100) not found
}
宕机与恢复 #
1.手动触发宕机: func panic(v interface{}) 无返回值
2.捕获宕机(即恢复宕机): func recover() interface{} 无参,返回捕获的值,值可为任意类型
示例1:
panic("手动dang宕机")
/**打印错误信息如下:
panic: 手动dang宕机
goroutine 1 [running]:
main.main()
/Users/jelly/go/src/jellygo1/mymain.go:4 +0x39
*/
恢复宕机示例:
package main
import "fmt"
func main() {
defer func() {
err := recover() //恢复宕机,程序正常了
fmt.Println("捕获到的错误", err) //捕获到的错误 手动dang宕机
}()
fmt.Println("hello")
panic("手动dang宕机")
fmt.Println("end") //这里没有执行,因为在调用panic方法是宕机了
}
备注: 有panic没有recover则程序宕机
有panic且有recover则程序不会宕机