企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
> go语言中主要有两类错误: > * error是可预见的错误,不会导致程序退出 > * panic是不可预见的错误,会导致程序退出。 ## error基本用法 > go语言内置了一个错误接口 ~~~ type error interface { Error() string } ~~~ > `errors包`提供了基本的错误实现 ~~~ // 创建一个错误 errors.New("错误信息") ~~~ > 例子 ~~~ package main import ( "errors" "fmt" ) // 通常一个函数的错误信息,都会放在最后一个返回值 // 一般如果函数没有错误,返回的error就是nil func DoTest() (int, error) { // 返回错误 return 0, errors.New("错误信息!") } func main() { _, err := DoTest() // 判断错误 if err != nil { fmt.Println(err) } } ~~~ ## 自定义错误类型 > 我们只要实现错误接口,就可以自定义错误类型 ~~~ package main import ( "fmt" "time" ) // 自定义错误类型MyError type MyError struct { What string // 错误的原因 When time.Time // 错误发生的时间 } // 实现error接口的方法 func (e *MyError) Error() string { return fmt.Sprintf("happend at %v, %s", e.When, e.What) } // 测试自定义的错误 func dotest() error { // 创建一个自定义错误,并返回 return &MyError{What: "it didn't work", When: time.Now()} } func main() { if err := dotest(); err != nil { fmt.Println(err) } } ~~~ ## panic用法 > panic,类似其他语言throw抛出异常一样,通过函数调用链,一层层的把异常往上抛出去,如果没有人拦截异常,就会退出程序 ~~~ package main import "fmt" func main() { fmt.Println("a") if true { // 抛出panic错误,后面的代码不会运行 panic("出错啦!") } fmt.Println("b") } ~~~ ## 拦截panic错误 > 通过defer和recover实现拦截panic错误 ~~~ package main import "fmt" // 演示拦截panic错误 func DoTest() { // 延迟执行函数 defer func() { // 在延迟执行函数中,通过recover拦截panic错误 if err := recover(); err != nil { fmt.Println("拦截到错误:", err) } }() // 抛出panic错误,后面代码不会执行 if true { panic("panic错误") } fmt.Println("b") } func main() { fmt.Println("a") DoTest() fmt.Println("c") } ~~~ > 因为我们通过recover函数,在延迟执行函数中,拦截了Panic错误,除了抛出panic错误的函数被中断了,其他执行流程都不受影响,类似其他语言中的try/catch机制