go语言之抛出异常

本文详细介绍了Go语言中的panic和recover机制,panic用于主动抛出错误,recover用于捕获并阻止panic的传播。当panic发生时,程序会逐层执行defer,打印调用堆栈,直到被recover捕获或程序退出。recover必须在defer函数体内直接调用才能有效。Go语言的错误处理主要通过error类型实现,而非异常系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一: panic和recover 

作用:panic 用来主动抛出错误; recover 用来捕获 panic 抛出的错误。

概述: 1,引发panic有两种情况 1)程序主动调用panic函数 2)程序产生运行时错误,由运行时检测并抛出 过程: ! 发生 panic 后,程序会从调用 panic的函数位置或发生panic 的地方立即返回,逐层向上执行函数的defer语句, 然后逐层打印函数调用堆栈,直到被 recover 捕获或运行到最外层函数而退出。 ! panic的参数是一个空接口类型 interface{},所以任意类型的变量都可以传递给 panic(xxx) ! panic 不但可以在函数正常流程中抛出,在 defer 逻辑里也可以再次调用 panic 或抛出 panic a defer 里面的 panic 能够被后续执行的 defer 捕获。 recover()用来捕获 panic,阻止panic继续向上传递recover()和defer一起使用 ,但是recover() 只  有在defer后面的函数体内被直接调用才能捕获panic终止异常否则返回 nil,异常继续向外传递

//这会获取失败
defer recover()
defer fmt.println(recover())
//嵌套两层也会获取失败
defer func() {
	func(){
		println("defer inner")
		recover() //无效
	}()
}

  以下场景会获取成功

package main
func f(){
    defer func() {
        println("defer inner")
        recover()
    }()
}
func except()  {
    recover()
}
func test(){
    defer except()
    panic("test panic")
}
func main()  {
    f()
    except()
    test()
}

  可以有多个panic被抛出,连续多个panic的场景只能出现在延迟调用里面,否则不会出现多个panic被抛出的场景。但只有最后一次panic能被捕获

package main

import "fmt"

func main(){
    defer func() {
        if err :=recover();err !=nil{
            fmt.Println(err)
        }
    }()
  //只有最后一次panic调用被捕获
    defer func() {
        panic("first defer panic")   //打印结构是这个
    }()
    defer func() {
        panic("second defer panic"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值