## 处理恐慌 实现长时间运行的进程时,某些代码路径可能会导致混乱。这通常见于未初始化的map和指针,以及在验证用户输入不良的情况下,例如除零问题。 在这些情况下,系统的部分崩溃比整体崩溃更糟糕,因此就需要捕获和处理发生的恐慌。 ### 实践 1. 获取第三方库: ``` go get github.com/apex/log ``` 2. 建立panic.go: ``` package panic import ( "fmt" "strconv" ) // Panic 演示除零恐慌 func Panic() { zero, err := strconv.ParseInt("0", 10, 64) if err != nil { panic(err) } a := 1 / zero fmt.Println("we'll never get here", a) } // Catcher 处理恐慌 func Catcher() { defer func() { if r := recover(); r != nil { fmt.Println("panic occurred:", r) } }() Panic() } ``` 4. 建立main.go: ``` package main import ( "fmt" "github.com/agtorre/go-cookbook/chapter4/panic" ) func main() { fmt.Println("before panic") panic.Catcher() fmt.Println("after panic") } ``` 5. 这会输出: ``` before panic panic occurred: runtime error: integer divide by zero after panic ``` ### 说明 这是捕捉恐慌的一个非常基本的例子。你可以想象使用更复杂的中间件,如何在运行许多嵌套函数后推迟恢复并捕获它。在恢复过程中,可以做任何你想要的事情,例如发送日志。 在大多数Web应用程序中,常见的是捕获恐慌并在发生混乱时发出http.InternalServerError消息。 * * * * 学识浅薄,错误在所难免。欢迎在群中就本书提出修改意见,以飨后来者,长风拜谢。 Golang中国(211938256) beego实战(258969317) Go实践(386056972)