MST

星途 面试题库

面试题:Go中defer语句与异常处理的结合应用

在Go语言中,如何利用defer语句结合recover函数实现优雅的异常处理?请编写一段代码示例,展示一个可能发生异常的场景,并使用defer和recover来捕获并处理异常,同时解释代码的执行逻辑。
35.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
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])
}

代码执行逻辑解释:

  1. main函数:调用test函数。
  2. test函数
    • defer语句:定义了一个匿名函数,这个匿名函数会在test函数返回前执行。匿名函数中使用recover函数来捕获可能发生的异常。如果捕获到异常(即recover返回值不为nil),则打印出捕获到的异常信息。
    • 异常模拟:定义一个长度为5的整数数组arr,然后尝试访问arr[10],这会导致数组越界异常。
  3. test函数执行到数组越界访问时,程序会抛出异常,此时test函数正常执行流程中断。但由于之前定义的defer语句,defer后的匿名函数会被执行,在匿名函数中recover捕获到异常,并打印出异常信息,从而实现了优雅的异常处理。