GoLang专题

Go语言错误和异常处理机制

2018-08-21  本文已影响0人  一根很帅的藤藤菜

错误和异常的区别

  1. 错误转异常,如程序尝试请求某个URL,最多尝试三次,尝试三次的过程中请求失败是错误,尝试完第三次还不成功的话,失败就被提升为异常了
  2. 异常转错误,如panic触发的异常被recover恢复后,将返回值中error类型的变量进行赋值,以便上层函数继续走错误处理流程

Go语言错误处理机制

error

type error interface {
    Error() string
}
errors.New("your first error code")
fmt.Errorf("error value is %d\n", errcode)
func Sqrt(f float64) (float64, error) {
    if f < 0 {
        return 0, errors.New("math: square root of negative number")
    }
}
//调用函数
result, err:= Sqrt(-1)
if err != nil {
   fmt.Println(err)
}

错误处理的正确姿势

var ERR_EOF = errors.New("EOF") 
var ERR_CLOSED_PIPE = errors.New("io: read/write on closed pipe") 
var ERR_NO_PROGRESS = errors.New("multiple Read calls return no data or error") 
var ERR_SHORT_BUFFER = errors.New("short buffer") 
var ERR_SHORT_WRITE = errors.New("short write") 
var ERR_UNEXPECTED_EOF = errors.New("unexpected EOF")

Go语言异常处理机制

panic

func abc() {
panic("我是abc,我要抛出一个异常了,等下defer会通过recover捕获这个异常,然后正常处理,使后续程序正常运行。")
fmt.Println("我是PHP里panic后面要打印出的内容。")
}

recover&defer

func abc() {
defer func() {
if err := recover(); err != nil {
fmt.Println("终于捕获到了panic产生的异常:", err) // 这里的err就是panic传入的内容
fmt.Println("我是defer里的匿名函数,我捕获到panic的异常了,我要recover恢复过来          了。")
}
}() //注意这个()就是调用该匿名函数的
panic("我是abc,我要抛出一个异常了,等下defer会通过recover捕获这个异常,捕获到我时,在abc里是不会输出的,会在defer里被捕获输出,然后正常处理,使后续程序正常运行")
fmt.Println("我是panic后面要打印出的内容。但是我是永远也打印不出来了。因为逻辑并不会恢复到panic那个点去,函数还是会在defer之后返回,也就是说执行到defer后,程序直接返回到main()里,接下来开始执行cba()")
} 

func cba() {
fmt.Println("我是cba,如果没有defer来recover捕获panic的异常,我是不会被正常执行的。")
}

异常处理的正确姿势

上一篇下一篇

猜你喜欢

热点阅读