示例(一段会发生错误的代码)
-
在默认情况下,当发生错误(panic)的时候,程序会崩溃并输出错误信息和调用栈。这对于调试非常有帮助,但在生产环境中,我们通常希望能够优雅地处理这些错误,而不是让程序崩溃。
-
如果我们希望当发生错误后,可以捕获错误并处理它,而不是让程序崩溃,我们可以使用
defer、panic和recover这三个关键字来实现错误处理。 -
defer用于注册一个函数,这个函数会在当前函数返回之前执行。无论函数是正常返回还是因为发生错误而返回,defer注册的函数都会被调用。 -
panic用于触发一个错误。当调用panic时,程序会停止正常的执行流程,开始执行defer注册
package main
import "fmt"
func main() {
num1 := 10
num2 := 0
result := num1 / num2 // 这行会发生除以零的错误
fmt.Println("结果是:", result) // 这行代码不会被执行,因为上面一行发生了错误
}
错误处理
-
go 不支持 try-catch-finally 这样的错误处理机制
-
但是我们可以使用
defer、panic和recover来实现类似的功能。 -
defer用于注册一个函数,这个函数会在当前函数返回之前执行。无论函数是正常返回还是因为发生错误而返回,defer注册的函数都会被调用。 -
panic用于触发一个错误。当调用panic时,程序会停止正常的执行流程,开始执行defer注册的函数,并且传递panic的参数给这些函数。 -
recover用于捕获panic触发的错误。当在defer注册的函数中调用recover时,如果当前正在处理一个panic,recover会
使用 defer + recover 捕获错误
- 下面是一个使用
defer和recover来捕获错误
package main
import "fmt"
func main() {
defer func() {
err := recover()
if err != nil {
fmt.Println("捕获到错误:", err)
}
}()
num1 := 10
num2 := 0
result := num1 / num2 // 这行会发生除以零的错误
fmt.Println("结果是:", result) // 由于错误被捕获,程序不会崩溃,这行代码不会被执行
fmt.Println("程序继续执行...") // 由于错误被捕获,程序不会崩溃,这行代码会被执行
}