package main
import (
"fmt"
)
func main() {
// 调用可能发生异常的函数
test()
}
func test() {
// 使用defer语句,确保无论是否发生异常,该函数都会在test函数返回前执行
defer func() {
// recover函数用于捕获异常
if r := recover(); r != nil {
fmt.Println("捕获到异常:", r)
}
}()
// 模拟可能发生异常的操作,这里会导致数组越界异常
var arr [5]int
fmt.Println(arr[10])
}
代码执行逻辑解释:
main
函数:调用test
函数。
test
函数:
defer
语句:定义了一个匿名函数,这个匿名函数会在test
函数返回前执行。匿名函数中使用recover
函数来捕获可能发生的异常。如果捕获到异常(即recover
返回值不为nil
),则打印出捕获到的异常信息。
- 异常模拟:定义一个长度为5的整数数组
arr
,然后尝试访问arr[10]
,这会导致数组越界异常。
- 当
test
函数执行到数组越界访问时,程序会抛出异常,此时test
函数正常执行流程中断。但由于之前定义的defer
语句,defer
后的匿名函数会被执行,在匿名函数中recover
捕获到异常,并打印出异常信息,从而实现了优雅的异常处理。