当前位置: 首页 > news >正文

【Go】--抛出和处理异常

Go语言异常处理:panic和recover机制

在Go语言中,异常处理主要通过panicrecover两个内置函数来实现。与传统的try-catch机制不同,Go采用了一种更加简洁和明确的错误处理方式。

panic函数

功能说明

  • panic函数用于引发运行时异常
  • 当程序遇到无法继续执行的严重错误时,可以主动调用panic
  • panic会导致当前goroutine的执行被中断

使用场景

  1. 程序遇到不可恢复的错误
  2. 参数验证失败
  3. 资源获取失败
  4. 业务逻辑中的严重错误

recover函数

功能说明

  • recover函数用于捕获panic引发的异常
  • recover只能在defer函数中调用才有效
  • 成功捕获异常后,程序可以继续执行

使用限制

  • 必须在defer函数内部调用
  • 只能捕获当前goroutine的panic
  • 如果没有panic发生,recover会返回nil

示例代码分析

package mainimport ("fmt"
)func fn1() {fmt.Println("start")
}func fn2() {defer func(){if err := recover(); err != nil {fmt.Println("recover:", err)}}()panic("我发生了错误")
}func main() {fn1()fn2()fmt.Println("ending")
}

执行结果:

start
recover: 我发生了错误
ending

关键点:

  • panicfn2函数中被触发
  • recoverdefer中成功捕获异常
  • 程序继续执行,输出"ending"
package mainimport ("fmt"
)func fn1(a,b int) int {defer func() {if err := recover(); err != nil {fmt.Println("计算错误:", err)}}()return a/b
}func main()  {fmt.Println(fn1(10,0))fmt.Println("ending")
}

执行结果:

计算错误: runtime error: integer divide by zero
0
ending

关键点:

  • 除零操作会触发运行时panic
  • recover捕获异常并输出错误信息
  • 函数返回默认值0,程序继续执行
package mainimport ("errors""fmt"
)func readFile(fileName string) error {if fileName == "test.txt" {return nil} else {return errors.New("文件不存在")}
}func fn() {defer func() {if err := recover(); err != nil {fmt.Println("读取文件错误:", err)}}()err := readFile("xxx.txt")if err != nil {panic(err)}
}func main() {fmt.Println("start")fn()fmt.Println("ending")
}

执行结果:

start
读取文件错误: 文件不存在
ending

关键点:

  • 自定义错误通过panic抛出
  • recover捕获业务逻辑中的异常
  • 优雅地处理文件不存在的情况

工作原理

panic的执行流程

  1. 程序遇到panic或运行时错误
  2. 当前函数的执行立即停止
  3. 开始执行所有的defer语句(LIFO顺序)
  4. 如果defer中有recover,则捕获异常
  5. 如果没有recover,程序崩溃并输出堆栈信息

recover的捕获机制

  1. recover必须放在defer函数中
  2. 当panic发生时,会逆序执行所有已注册的defer函数
  3. 在defer函数中调用recover可以捕获panic值
  4. 捕获后,程序从panic点之后的代码继续执行
http://www.dtcms.com/a/532455.html

相关文章:

  • Word转PDF工具,免费生成图片型文档
  • [sam2图像分割] MemoryAttentionLayer._forward_ca | 交叉注意力
  • 孝感网站建设公司电子商务平台内经营者享有公平交易的权利
  • Go语言:常量计数器iota的意义
  • 27-Scikit Learn:讲解Python中经典的机器学习工具库
  • 做网站运营工作流程网络营销概念
  • nnUNetv2
  • Android Studio新手开发第三十二天
  • 《神领物流》day08-作业范围微服务_完整代码【简单易懂注释版】
  • 西安网站定制开发h5课件制作软件
  • ABAP 调用接口传输文件(multipart form-data)
  • 联邦学习:现状与展望!
  • Linux IPC 为什么要这么架构
  • 实验室PRCV 2025论文分享|如何利用大模型自动生成高质量英语阅读理解练习题
  • C 转 C++:高效上手的核心容器与函数指南
  • 网站建设人员岗位设置网站建设职业兴趣要求
  • MyBatis操作数据库入门
  • 美团网站开发北京网站建设外包公司
  • [nanoGPT] 编排训练 | `get_batch` | AdamW | `get_lr` | 分布式训练(DDP)
  • 2.2.1.1 大数据方法论与实践指南-公司产品功能命名管理
  • Spring Boot3零基础教程,@SpringBootApplication 注解详细说明,笔记63
  • Flutter 响应式 + Clean Architecture / MVU 模式 实战指南
  • 免费注册二级域名的网站网站制作哪些公司好
  • 【Go】--time包的使用
  • VR 工业组装案例
  • 网络运维管理
  • 使用STM32H723VGT6芯片驱动达妙电机
  • 【计算机通识】进程、线程、协程对比讲解--特点、优点、缺点
  • 专业做俄语网站建设上海建设公司注册
  • 南京营销型网站制作建设一个网站需要什么手续