错误处理

错误处理 #

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则程序不会宕机
Build by Loppo 0.6.15