处理普通错误 参考文章https://www.runoob.com/go/go-...
参考1: http://www.topgoer.com/函数/...
参考2: https://zhuanlan.zhihu.com/p/...html
Golang 没有结构化异常,使用 panic 抛出错误,recover 捕获错误。异常的使用场景简单描述:Go中能够抛出一个panic的异常,而后在defer中经过recover捕获这个异常,而后正常处理。golang
package main import ( "fmt" ) // 举例除数为0 func main() { var a1 int = 2 var b1 int = 0 // 犹豫除数为0 报错终止 res1 := divisionIntRecover(a1, b1) fmt.Println("res1",res1) // 下面的语句没法正常运行 var a2 int = 2 var b2 int = 2 res2 := divisionIntRecover(a2, b2) fmt.Println("res2",res2) } //import "fmt" func divisionIntRecover(a int, b int) (ret int) { // 先注释掉 defer 进程终止抛出异常 //defer func() { // if err := recover(); err != nil { // // 打印异常,关闭资源,退出此函数 // fmt.Println(err) // ret = -3 // } //}() return a / b }
结果web
$ go run test.go panic: runtime error: integer divide by zero #错误 goroutine 1 [running]: main.divisionIntRecover(...) D:/web/golang/test.go:30 #错误具体行数 main.main() D:/web/golang/test.go:10 +0x12 exit status 2
这样的终止会致使服务中止,咱们下面引入在defer中经过recover捕获异常ide
package main import ( "fmt" ) // 举例除数为0 func main() { var a1 int = 2 var b1 int = 0 // 严重错误,处理为-3 res1 := divisionIntRecover(a1, b1) fmt.Println("res1",res1) // 继续运行 var a2 int = 2 var b2 int = 2 res2 := divisionIntRecover(a2, b2) fmt.Println("res2",res2) } //import "fmt" func divisionIntRecover(a int, b int) (ret int) { // 打开注释,若是出现严重错误 正常处理 返回-3 defer func() { if err := recover(); err != nil { // 打印异常,关闭资源,退出此函数 fmt.Println(err) ret = -3 } }() return a / b }
结果函数
$ go run test.go runtime error: integer divide by zero res1 -3 res2 1
咱们举例是 “除数为0”
好比还有其余状况指针
- 空指针引用
- 下标越界
- 除数为0
- 不该该出现的分支,好比default
- 输入不该该引发函数错误