MST

星途 面试题库

面试题:Go语言中panic异常处理机制的基础理解

在Go语言中,简要说明panic的触发场景有哪些?以及如何使用defer和recover来捕获并处理panic?
30.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

panic触发场景

  1. 运行时错误:例如数组越界访问。比如有一个数组 a := [3]int{1, 2, 3},如果访问 a[4],就会触发 panic,因为索引4超出了数组 a 的有效范围(0到2)。
  2. 空指针引用:当试图对一个空指针进行解引用操作时会触发 panic。例如 var p *int; *p = 1,这里 p 是一个空指针,对其解引用赋值会引发 panic
  3. 类型断言失败:在进行类型断言时,如果实际类型与断言的类型不匹配会触发 panic。比如 var i interface{} = "hello"; num := i.(int),这里将 string 类型的 i 断言为 int 类型,会导致 panic
  4. 显式调用 panic 函数:开发者可以在代码中主动调用 panic 函数来触发异常。例如 if someCondition { panic("自定义错误信息") }

使用defer和recover捕获并处理panic

package main

import "fmt"

func main() {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("捕获到panic:", r)
		}
	}()
	// 模拟可能触发panic的操作
	panic("这是一个测试panic")
	fmt.Println("这行代码不会被执行")
}

在上述代码中,defer 注册了一个匿名函数。当外层函数(这里是 main 函数)发生 panic 时,defer 函数会被执行,recover 函数会尝试恢复程序的正常执行。如果 recover 捕获到了 panic,就可以对其进行处理,例如打印错误信息等。如果没有 recoverpanic 会导致程序崩溃并打印出堆栈跟踪信息。