多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## GO错误机制 1. GO没有异常机制 2. errors.New可以快速创建错误实例(需要实现error接口) 3. 绝不要忽略错误,忽视错误会带来问题 ## 错误类型(内置错误接口) `error`是一个类型,定义如下: ~~~go type error interface { Error() string } ~~~ ## 错误断言 ### 1.断言底层结构体类型,使用结构体字段获取更多信息 ~~~go func main() { f, err := os.Open("/test.txt") if err, ok := err.(*os.PathError); ok { fmt.Println("File at path", err.Path, "failed to open") return } fmt.Println(f.Name(), "opened successfully") } ~~~ 在上面的程序里,我们在第 10 行使用了类型断言(Type Assertion)来获取`error`接口的底层值(Underlying Value) ### 2.断言底层结构体类型,调用方法获取更多信息 对底层类型进行断言,然后通过调用该结构体类型的方法,来获取更多的信息 标准库中的`DNSError`结构体类型定义如下: ~~~go package net type DNSError struct { ... } func (e *DNSError) Error() string { ... } func (e *DNSError) Timeout() bool { ... } func (e *DNSError) Temporary() bool { ... } ~~~ ~~~go func main() { addr, err := net.LookupHost("golangbot123.com") if err, ok := err.(*net.DNSError); ok { if err.Timeout() { fmt.Println("operation timed out") } else if err.Temporary() { fmt.Println("temporary error") } else { fmt.Println("generic error: ", err) } return } fmt.Println(addr) } ~~~ ### 3.直接比较 ~~~go var ErrBadPattern = errors.New("syntax error in pattern") func main() { files, error := filepath.Glob("[") if error != nil && error == filepath.ErrBadPattern { fmt.Println(error) return } fmt.Println("matched files", files) } ~~~