【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,避免滥用,以确保程序的可维护性和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/9967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt 学习笔记】Qt常用控件 | 多元素控件 | Table Widget的说明及介绍

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 多元素控件 | Table Widget的说明及介绍 文章编号&#…

美港通正规炒股市场美股证券市场地产股的春天 来了吗?

查查配地产股的春天 来了吗? 美港通证券以其专业的服务和较低的管理费用在市场中受到不少关注。该平台提供了实盘交易、止盈止损、仓位控制等功能,旨在为投资者提供更为全面的投资体验。 昨天房地产行业的大事可真不少!早间,杭州宣布全面取消住房限购,不再审核购房资格。杭州…

Git详解之五:分布式Git

为了便于项目中的所有开发者分享代码,我们准备好了一台服务器存放远程 Git 仓库。经过前面几章的学习,我们已经学会了一些基本的本地工作流程中所需用到的命令。接下来,我们要学习下如何利用 Git 来组织和完成分布式工作流程。 特别是&#…

OpenCV使用 Kinect 和其他兼容 OpenNI 的深度传感器(75)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:使用 OpenCV 创建视频(74) 下一篇 :OpenCV使用 Orbbec Astra 3D 相机(76) 目的:​ 通过 VideoCapture 类支持与 OpenNI 兼容的深度传感器(Kinect、XtionPRO 等)。…

【影片欣赏】【指环王】【魔戒:国王归来 The Lord of the Rings: The Return of the King】

往期魔戒博客见: 【影片欣赏】【指环王】【魔戒:护戒使者 The Lord of the Rings: The Fellowship of the Ring】 【影片欣赏】【指环王】【魔戒:双塔奇谋 The Lord of the Rings: The Two Towers】 2004年发行,Special Extend…

K8s源码分析(二)-K8s调度队列介绍

本文首发在个人博客上,欢迎来踩! 本次分析参考的K8s版本是 文章目录 调度队列简介调度队列源代码分析队列初始化QueuedPodInfo元素介绍ActiveQ源代码介绍UnschedulableQ源代码介绍**BackoffQ**源代码介绍队列弹出待调度的Pod队列增加新的待调度的Podpod调…

IP定位技术在打击网络犯罪中的作用

随着互联网的普及和信息技术的发展,网络犯罪日益猖獗,给社会治安和个人财产安全带来了严重威胁。而IP定位技术的应用为打击网络犯罪提供了一种有效手段。IP数据云将探讨IP定位技术在打击网络犯罪中的作用及其意义。 1. IP定位技术的原理 IP&#xff08…

【Hive】Hive简介概述、安装、基础语法、 表及数据操作(一)

Hive 简介 概述 Hive是由Facobook开发的后来贡献给了Apache的一套用于进行数据仓库管理的工具,使用类SQL语言来对分布式文件系统中的PB级别的数据来进行读写、管理以及分析Hive基于Hadoop来使用的,底层的默认计算引擎使用的是MapReduce。Hive利用类SQ…

k8s相关常用语句

打标签 kubectl label nodes kubernetes.io/hostname10.78.16.4 envproduction kubectl label nodes kubernetes.io/hostnamecn-shenzhen.10.78.16.4 envproduction 查询 ktctl.exe connect -n master docker exec -it ‘271d3c847417’ /bin/bash docker container ls 查…

国产操作系统上使用HHDESK桌面运维工具 _ 统信UOS _ 麒麟

原文链接:国产操作系统上使用HHDESK桌面运维工具 | 统信UOS | 麒麟 Hello,大家好啊!在多功能软件的帮助下,日常的计算机操作可以变得更加高效便捷。今天,我要向大家介绍的是HHDESK,这是一款功能丰富的工具&…

点云工具 CloudCompare 查看三维模型

CloudCompare 是一款三维点云(Point Cloud)处理软件,可以方便地使用计算法向量、优化法向量、泊松构网、滤波等功能。 工具下载地址:nullCloudCompare website entry pagehttps://cloudcompare.org/ github地址: GitH…

【JavaEE网络】用Form与Ajax构建HTTP请求

目录 通过 form 表单构造 HTTP 请求form 发送 GET 请求form 发送 POST 请求 通过 ajax 构造 HTTP 请求发送 GET 请求发送 POST 请求发送 application/json 数据封装 ajax 方法 通过 form 表单构造 HTTP 请求 form (表单) 是 HTML 中的一个常用标签. 可以用于给服务器发送 GET …

权限束缚术--权限提升你需要知道这些

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要对渗透测试中权限提升的一些基础知识进行整理 并不包含权限提升的具体操作 适合要入门权限提升的朋友 提权的重要性 我们在渗透网站时,我们往往会拿到一些权限,但是我们的权限有…

Mybatis之ResultMap

前言 select语句查询得到的结果集是一张二维表,水平方向上看是一个个字段,垂直方向上看是一条条记录。而Java是面向对象的程序设计语言,对象是根据类定义创建的,类之间的引用关系可以认为是嵌套的结构。在JDBC编程中,…

上位机图像处理和嵌入式模块部署(树莓派4b和进程监控)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 虽然软件开发的时候,我们总是希望软件不要发生bug、不要有闪退、甚至于说不要有内存泄漏,但这也只是我们自己的一厢情愿而已…

Android解放双手的利器之ViewBinding

文章目录 1. 背景2. ViewBinding是什么3. 开启ViewBinding功能4. 生成绑定类5. 使用ViewBinding5.1Activity 中使用5.2 Fragment 中使用5.3 ViewHolder 中使用 6. ViewBinding的优点7. 与 dataBinding 对比 1. 背景 写代码最繁琐的是什么?重复的机械操作。我们刚接…

读书笔记——《高质量C++/C编程指南》(4)

前言 前两篇笔记对这本书里面的文件结构、代码风格、命名规则、表达式和基本语句的良好编程习惯,将记录常量与函数设计做了记录。本篇读书笔记(4)将记录 内存管理 内存分配方式 内存分配的方式有三种: (1&#xf…

oracle中保存点的使用

在Oracle数据库中,保存点(Savepoint)是一个重要的概念,它允许用户在事务执行过程中设置一个或多个标记点,以便在后续的操作中可以回滚到这些标记点,而不是回滚整个事务。保存点的主要作用是提高事务处理的效…

sql分页查询

引言 在数据库管理和开发中,分页查询是一项常见的需求,尤其在处理大量数据时。作为资深DBA工程师,掌握SQL分页查询技术至关重要。本文将深入探讨SQL分页查询的原理、方法以及最佳实践。 一、分页查询的原理 分页查询的原理是将整个结果集按…

JAVA 项目<果园之窗>_完结

目录 1、前言:2、视频展示:3、环境配置:4、工程代码:5、原理:6、原理补充:7、综上: 1、前言: 因为没有足够的时间这个项目用的是别人搭好的框架,在此基础上做调整并根据前…