【GoLang基础】panic和recover有什么作用?

2024-05-11 14:20

本文主要是介绍【GoLang基础】panic和recover有什么作用?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题引出:

Go语言中的panic和recover有什么作用?

解答:

在Go语言中,panicrecover 是用于处理程序错误和恢复的机制。

panic:

  • panic 是一个内建函数,用于中止当前函数的执行。当函数内部发生了一些不能继续执行的错误或异常时,可以调用 panic 来引发一个运行时错误。
  • 调用 panic 会立即停止当前函数的执行,并开始沿着调用栈向上传播,直到程序终止。同时会执行在该函数中被延迟的函数调用(defer)。如果没有处理 panic,程序会打印出调用栈信息,并以非零状态退出。

示例:

func processFile(filename string) {if filename == "" {panic("Filename cannot be empty!")}// ... other code
}

recover:

  • recover 是一个内建函数,用于从 panic 中恢复。它只能在延迟函数(defer)中调用。
  • 当程序执行到 panic 时,它会中止当前函数的执行,然后执行该函数的延迟函数。在延迟函数中调用 recover 可以捕获 panic,防止其继续向上传播,从而使程序继续执行。

示例:

func handlePanic() {if r := recover(); r != nil {fmt.Println("Recovered from panic:", r)// You can perform additional recovery actions here}
}func processFile(filename string) {defer handlePanic() // defer a function to recover from panicif filename == "" {panic("Filename cannot be empty!")}// ... other code
}

使用场景:

  • panic 通常用于表示程序遇到了严重问题,无法继续执行,比如空指针解引用、数组越界等。这种情况下,我们可以使用 panic 来中止程序,并通过输出日志或其他方式记录问题。
  • recover 通常用于尽量避免程序崩溃,在必要时进行一些清理工作或记录日志,并尝试使程序继续执行。但应该谨慎使用 recover,因为滥用它可能会导致难以调试的代码。

示例:
假设我们有一个函数用于读取配置文件,并在读取过程中遇到错误时触发 panic,同时使用 recover 来恢复并处理错误。

package mainimport ("fmt""encoding/json""os"
)type Config struct {Port    intTimeout int// 其他配置项...
}func readConfig(filename string) (*Config, error) {file, err := os.Open(filename)if err != nil {return nil, err}defer file.Close()decoder := json.NewDecoder(file)var config Configif err := decoder.Decode(&config); err != nil {panic(fmt.Sprintf("Failed to decode config file: %v", err))}return &config, nil
}func main() {defer func() {if r := recover(); r != nil {fmt.Println("Recovered from panic:", r)}}()config, err := readConfig("config.json")if err != nil {fmt.Printf("Error reading config file: %v\n", err)return}fmt.Println("Config:", config)
}

小结:

panicrecover 是 Go 语言中用于处理异常和错误的机制,能够帮助我们应对意外情况并使程序更加健壮。但在编写代码时,应该仔细考虑何时使用 panicrecover,避免滥用,以确保程序的可维护性和稳定性。

这篇关于【GoLang基础】panic和recover有什么作用?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/979776

相关文章

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close