Go 错误处理
- Go 语言通过内置的错误接口 errors.New(“日志描述”),import “errors”
package main
import (
"errors"
"fmt"
)
func Sqrt(f float64) (float64, error) {
if f < 0 {
return 0 ,errors.New("negative number")
}else if f == 0 {
return f,errors.New("warnning number")
}else {
return f,errors.New("normal number")
}
}
func main(){
result, err:= Sqrt(-1)
println(result)
if err != nil {
fmt.Println(err)
}
result1, err1:= Sqrt(4)
println(result1)
if err1 != nil {
fmt.Println(err1)
}
result2, err2:= Sqrt(0)
println(result2)
if err2 != nil {
fmt.Println(err2)
}
}
+0.000000e+000
+4.000000e+000
+0.000000e+000
negative number
normal number
warnning number
Process finished with exit code 0
- GO语言中的panic 用于主动抛出错误,recover用于捕获panic抛出的错误。是两个内置函数
- 引发panic有两种情况,一是程序主动调用,二是程序产生运行时错误,由运行时检测并退出。
- 运行panic后,程序会从调用panic的函数位置或发生panic的地方立即返回,逐层向上执行函数的defer语句,逐层打印函数调用堆栈,直到被recover捕获或运行到最外层函数。
- panic不但可以在函数正常流程中抛出,在defer逻辑里也可以再次调用panic或抛出panic。defer里面的panic能够被后续执行的defer捕获。
- recover用来捕获panic,阻止panic继续向上传递。
- recover()和defer一起使用,但是defer只有在后面的函数体内直接被掉用才能捕获panic来终止异常,否则返回nil,异常继续向外传递
package main
import (
"errors"
"fmt"
)
func main() {
Error()
afterDeferRecoverErrorfunc()
}
func Error() {
defer catch()
panic("panic 错误")
fmt.Println("抛出一个错误后继续执行代码?")
}
func catch() {
if r := recover(); r != nil {
fmt.Println("testError() 遇到错误:", r)
var err error
switch x := r.(type) {
case string:
err = errors.New(x)
case error:
err = x
default:
err = errors.New("")
}
if err != nil {
fmt.Println("recover后的错误:",err)
}
}
}
func afterDeferRecoverErrorfunc(){
fmt.Println("遇到错误之后,运行函数 ")
}
testError() 遇到错误: panic 错误
recover后的错误: panic 错误
遇到错误之后 func
Process finished with exit code 0