Go语言异常处理方式

ops/2024/10/22 8:44:21/

Go 语言没有传统的异常处理机制,如 Java、C++ 或 Python 中的 try-catch 语句。取而代之,Go 采用了基于返回错误值和 panic/recover 机制的混合模式来进行错误处理。以下是 Go 语言中处理异常(或称错误)的两种主要方式:

1. 通过返回错误值进行错误处理

这是 Go 语言中最常见、最推荐的错误处理方式。函数或方法通常会返回一个额外的 error 类型的值作为其最后一个返回值。当函数内部发生可预见的错误情况时,它会返回一个非 nilerror 对象来表示发生了错误,而不是抛出异常。

func someFunction(arg1, arg2 string) (result int, err error) {// ...执行逻辑...if someErrorCondition {return 0, errors.New("An error occurred")}// ...其他逻辑...return successfulResult, nil
}// 调用方需要检查返回的错误值
res, err := someFunction("input1", "input2")
if err != nil {// 处理错误,如记录日志、向用户返回错误信息、尝试恢复操作等log.Printf("An error occurred: %v", err)return
}
// 如果 err == nil,说明没有错误,可以安全地使用 res
// ...

2. 使用 panic 和 recover 进行异常处理

panic 是 Go 语言中用于触发运行时恐慌(类似于抛出异常)的内建函数。当遇到不可恢复的严重错误、程序逻辑错误或者违反了程序的不变量等情况时,可以调用 panic(value),其中 value 可以是任何类型。panic 会导致当前 goroutine(协程)立即停止执行,并开始执行其延迟函数(由 defer 关键字声明),然后逐层向上回溯调用栈,直到找到并执行第一个匹配的 recover(),或者到达主 goroutine 使得程序崩溃。

recover 是另一个内建函数,用于捕获发生在同一 goroutine 中的 panic。它只能在 deferred 函数中有效。当 recover() 在一个正在执行的 deferred 函数中被调用时,且该 goroutine 正处于 panic 状态,recover() 将返回传递给 panic() 的值,并恢复正常的控制流。如果没有 panic 发生,recover() 将返回 nil

func someCriticalFunction() {defer func() {if r := recover(); r != nil {// 捕获到 panic,进行错误处理和恢复操作log.Printf("Recovered from panic: %v", r)// 可能的清理工作、通知客户端等}}()// ...函数逻辑...if unrecoverableError {panic("Unrecoverable error occurred")}// ...
}

总结来说,Go 语言中异常处理主要依赖于以下原则:

  • 通过返回 error 值进行常规错误处理,鼓励程序员显式检查并处理错误。
  • 使用 panicrecover 处理程序中的严重错误或异常情况,通常仅限于无法通过返回错误值妥善处理的情况,以及需要在更高层级统一捕获和恢复的场景。由于 panic 和 recover 的使用容易掩盖程序逻辑,所以在 Go 语言中它们并不作为常规错误处理手段,而是作为最后的保障或在特定情况下(如实现断言、保护程序状态一致性等)使用。


http://www.ppmy.cn/ops/5537.html

相关文章

Python的pytest框架(1)--基本概念、入门

按基础到进阶的顺序,学习Python的pytest框架,本篇文章先讲一讲pytest的基本概念、入门使用规则。 目录 一、pytest基础知识 1、安装 2、pytest框架主要做了什么工作 二、pytest的规则约定、运行方式以及参数详解 1、编写测试用例 模块&#xff08…

Linux CPU火焰图

Linux CPU火焰图 1、火焰图简介 火焰图(Flame Graph)是一种强大的性的性能分析工具,专门用于可视化cpu时间消耗咋各个函数栈上的情况,可以很快帮助开发这识别程序中的性能瓶颈和热点函数,从而有效的进行程序优化&…

Redis从入门到精通(二十二)Redis原理之数据结构、网络模型、通心协议、内存回收

文章目录 第8章 Redis原理8.1 Redis数据结构8.1.1 RedisObject8.1.2 动态字符串(SDS)8.1.3 string8.1.4 List8.1.5 Set8.1.6 ZSet8.1.7 Hash 8.2 Redis网络模型8.2.1 五种网络模型介绍8.2.1.1 用户空间和内核空间8.2.1.2 阻塞IO8.2.1.3 非阻塞IO8.2.1.4 …

OpenHarmony实战开发-如何使用弹簧曲线实现抖动动画及手机振动效果案例。

介绍 本示例介绍使用vibrator.startVibration方法实现手机振动效果,用keyframeAnimateTo关键帧动画实现点击后的抖动动画。 效果图预览 使用说明 1.加载完成后显示登录界面,未勾选协议时点击一键登录按钮会触发手机振动效果和提示文本的抖动动画。 实…

MyBatis 面试题(七)

1. MyBatis 什么时候必须指定jdbcType 和javaType? MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。在 MyBatis 中,jdbcType 和 javaType 是两个重要的属性,用于指定数据库字段与 Java 对象属性之间的类型映射。…

【设计模式】6、bridge 桥接模式

六、bridge 桥接模式 桥接设计模式 复杂逻辑拆分: 如果需要完成复杂的逻辑,可以把复杂逻辑设计为接口,内部再拆分为若干接口。这样复杂的逻辑会被拆分开,方便解耦。 例如:如果遥控器控制设备。可以遥控器设计为复杂…

【linux kernel】 一文总结linux内核中的kobject、kset和ktype

文章目录 一、kobject、kset、ktype(1-1)kobject(1-2)ktype(1-3)kset 二、kobject操作API(2-1)kobject_init()(2-2)kobject_add()(2-3&#xff09…

【EtherCAT】FMMU和SM简介

目录 一、简介 1、 FMMU 2、SM (1) 缓冲模式 (2)邮箱模式 3、FMMU将物理存储器映射到逻辑过程数据映射的配置原理 二、FMMU和SM在EtherCAT从站控制器的存储空间分配 三、FMMU和SM部分寄存器描述(LAN9253) 1、FMMU 2、SM 四、FMMU和SM的数据结构(soem主站&…