Go_异常处理
创建错误
var errNotFound error = errors.New("Not found") errors中的New func New(text string) error {}
error实际上是个接口
type error interface { Error() string }
我们可以自定义错误
package main import ( "fmt" "os" "time" ) type PathError struct { path string op string createTime string message string } func (p *PathError) Error() string { return fmt.Sprintf("path=%s op=%s createTime=%s message=%s", p.path, p.op, p.createTime, p.message) } func Open(filename string) error { file, err := os.Open(filename) if err != nil { return &PathError{ path: filename, op: "read", message: err.Error(), createTime: fmt.Sprintf("%v", time.Now()), } } defer file.Close() return nil } func main() { err := Open("C:/sdklflakfljdsafjs.txt") switch v := err.(type) { case *PathError: fmt.Println("get path error,", v) default: } }
Panic和Recover
panic 意思是抛出一个异常, 和python的raise用法类似
recover是捕获异常,和python的except用法类似
defer会延迟函数到其他函数之后完之后再执行,后面跟的是函数golang 的错误处理流程:
当一个函数在执行过程中出现了异常或遇到panic(),正常语句就会立即终止,然后执行 defer 语句,再报告异常信息,最后退出 goroutine。如果在 defer 中使用了 recover() 函数,则会捕获错误信息,使该错误信息终止报告。
package main import ( "fmt" ) func main() { f() fmt.Println("Returned normally from f.") } func f() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) fmt.Println("Recovered in f", r) } }() fmt.Println("Calling g.") g() fmt.Println("Returned normally from g.") } func g() { panic("ERROR") }