Go-异常处理(defer recover panic)
系列文章目录
提示:goi语言基础文章
GO-异常处理
文章目录
- 系列文章目录
- 前言
- 一、关键字含义
- defer /recover 实现异常捕获和处理
- 应用场景
- defer
- recover
- panic
- 二、实例
- 实例讲解上述几种情况
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
Go 语言在运行当中会出现panic ,为了解决和避免该问题学习defer,panic, recover 关键字
一、关键字含义
defer /recover 实现异常捕获和处理
defer 主要是指定一个延迟调用函数;
recover 发生异常的时候,可以去恢复我们的一个协程,并且拿到一个导致协程中断的消息。
应用场景
- 资源释放: 文件操作,打开文件,判断没有错误的情况下,立马去声明一个defer 调用(file close)关闭; 网络连接,tcp 连接建立连接成功之后,就可以调用defer 去关闭;
- 异常捕获和处理: 方法bi’r结束(异常结束和正常结束),都会触发defer 调用 ;
defer
- defer 关键字用来声明一个延迟调用函数,该函数可以是匿名函数也可以是具名函数
- defer 延迟函数执行时间(位置),方法return 之后,返回参数到调用方法之前; A调用B, defer 在B方法return 之后,但是在B方法值返回之前
- defer 延迟函数可以在方法返回之后改变改变函数的返回值;不是任何值都可改变,若依值类型返回不会受影响。依指针全局变量可以改变;
- 在方法结束(正常退出,异常结束)都会去调用defer声明的延迟函数,可以有效避免因异常导致的资源无法释放的问题;
- 可以指定多个defer延迟函数,多个延迟函数执行顺序为后进先出;
- defer 通常用于资源释放,异常捕获等场景。例如: 关闭连接,关闭文件等;
- defer与recover 配合可以实现异常捕获与处理逻辑;
- 不建议在for 循环中使用defer;
recover
- Go 语言内置函数,可以让进入宕机流程中的goroutine 恢复过来;比如A方法中五个步骤,在第三个触发了异常触发了defer 函数,那么recover 恢复后第三个步骤之后的步骤是不会执行。恢复协程使应用比较稳定,并不意味之按照之前的流程走。
- recover 仅在延迟函数,defer 中有效, 在正常的执行过程中,调用recover 会返回nil并且没有其他任何效果;
- 如果当前的goroutine 出现panic(其它语言说的异常),调用recover可以捕获到panic的输入值,并且恢复正常执行;
panic
- Go 语言的一种异常机制;
- 可以通过panic 函数主动抛出异常
二、实例
实例讲解上述几种情况
代码如下(示例):创建dir; main.go case/defer.go
// case/defer.go
package _caseimport ("fmt""io""log""os"
)// defer 关键字用来声明一个延迟调用函数
// 该函数可以是匿名函数也可以是具名函数
// defer 延迟函数的执行顺序为后进先出
func DeferCase1() {fmt.Println("开始执行DeferCase1")defer func() {fmt.Println("调用了匿名函数1")}()defer f1()defer func() {fmt.Println("调用了匿名函数2")}()fmt.Println("DeferCase1执行结束")
}// 参数预计算
func DeferCase2() {i := 1defer func(j int) {fmt.Println("defer J:", j)}(i + 1)// 闭包defer func() {fmt.Println("defer j:", i)}()i = 99fmt.Println("i:", i)
}// 返回值
// defer 函数执行在return 之后
func DeferCase3() {i, j := f2()fmt.Printf("j:%d,j:%d,g:%d", i, *j, g)
}func f1() {fmt.Println("调用了具名函数1")
}var g = 100func f2() (int, *int) {defer func() {g = 200}()fmt.Println("f2 g:", g)return g, &g
}func FileReadCase() {file, err := os.Open("README.md")if err != nil {log.Fatal(err)}//通过defer 调用资源释放方法defer func() {file.Close()fmt.Println("释放文件资源")}()buf := make([]byte, 1024)for {n, err := file.Read(buf)if err != nil && err != io.EOF {log.Fatal(err)}if n == 0 {break}fmt.Println(buf[:n])}}func ExceptionCase() {defer func() {// 捕获异常, 恢复协程err := recover()// 异常处理if err != nil {fmt.Println("异常处理 defer recover", err)}}()fmt.Println("开始执行ExceptionCase方法")panic("ExceptionCase抛出异常")fmt.Println("ExceptionCase方法执行结束")
}
// main.go
package mainimport _case "defer_recover_panic/case"func main() {//_case.DeferCase1()//_case.DeferCase2()//_case.DeferCase3()//_case.ExceptionCase()_case.FileReadCase()
}
总结
略
相关文章:
Go-异常处理(defer recover panic)
系列文章目录 提示:goi语言基础文章 GO-异常处理 文章目录 系列文章目录前言一、关键字含义defer /recover 实现异常捕获和处理应用场景deferrecoverpanic 二、实例实例讲解上述几种情况 总结 前言 提示:这里可以添加本文要记录的大概内容: …...
【完美解决】mysql启动不了:本地计算机上的MySQL服务启动后停止
本文基于mysql8.0,5.7也可以参考 navicat 突然莫名其妙连不上mysql 查看服务,也启动不了,手动启动出现错误: 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止 20230525更新! 先…...
C++ Qt 项目设计:基于C++与Qt的跨平台定时关机/关屏应用开发
基于C与Qt框架的定时关机与关屏应用开发全攻略 (一) 项目概述 (Project Overview)1.1 项目需求解析 (Analyzing the Project Requirements)1.2 选择技术栈 (Choosing the Tech Stack)1.3 功能概览 (Function Overview) (二) 设计思路 (Design Thinking)2.1 系统架构设计 (Syste…...
Python新技术和趋势:如何应对Python生态的变化和发展趋势
第一章:引言 Python作为一门简洁、优雅且易于学习的编程语言,一直以来都备受开发者的喜爱。它拥有强大的生态系统和活跃的社区,使得Python在各个领域都有广泛的应用。然而,随着时间的推移,Python生态系统也在不断演变…...
Flutter 又一元老离职,感谢 Tim 这些年的付出
前天在 insiders 收到 Tim Sneath 的离职邮件时感觉很震惊,因为他绝对是 Flutter 团队的元老级人物,几乎每次一次 Flutter 版本发布和社区活动都有他的身影,可以说他是我的 Flutter 领路人之一。 Tim 是在 2017 加入 Flutter 团队࿰…...
C++学习笔记3:sort和priority_queue的比较器重载
1 sort 三种方法 1. 直接重载函数 #include <vector> #include <memory> #include <vector> #include <queue> #include <iostream> #include <algorithm>using namespace std;class Node{ public:int value;Node(){value 0;};explici…...
Java之旅——Mybatis
Mybatis 是一个基于 Java 的 ORM(Object-Relational Mapping),用于 Java 应用程序的持久层框架,它将在 Java 对象和数据库关系之间建立一个映射。Mybatis 的作用主要是简化 SQL 语句的编写和维护,以及减少代码中的冗余…...
抽奖中的分布式锁应用
开发抽奖时遇到的分布式锁问题,特此记录一下几种实现方案 背景 开发中遇到个抽奖需求,会根据当前奖池内道具数量随机道具并发送给用户。这里面涉及到超发的问题,需要使用到分布式锁,特此记录一下常用的几种方案。 “超发”&#…...
项目总结 车牌识别
代码贴:OpenCV实战5 车牌号识别_opencv车牌字符识别_爱钓鱼的歪猴的博客-CSDN博客 目录 1、效果 2、代码思路 0、准备车配字符模板图片以及字符文件 1、对整图进行预处理 得到突出车牌的cany边缘图 2、车牌字体联通在一起,形成一个区域 3、筛选出车…...
一台服务器通过apache安装多个web应用
当我们只有一台linux服务器资源但有创建多个网站的需求时,我们可以通过安装一个网站服务器Apache进行搭建,此次服务器使用Centos 7 下面分别介绍一个域名多个端口和多个域名用Apache来搭建多个网站的操作过程。 一、使用apache 服务器 (一…...
网络连通性测试
ping 在Linux上,你可以使用Shell脚本编写一个for循环来ping一个网段的地址。下面是一个简单的示例: #!/bin/bashsubnet"192.168.0"for ((i1; i<255; i)); doip"$subnet.$i"ping -c 1 -W 1 $ip >/dev/null 2>&1if [ $…...
AntDB-S流式数据库体验
本文作者:彭冲老师,上一篇彭老师体验了亚信刚发布的社区版AntDB-T数据库,文章如下: AntDB-T交易型数据库体验 本文继续体验AntDB-S流式数据库的,AntDB-S目前还未开放社区版,可以联系AntDB小助手进行体验。…...
CentOS 和 Windows 上添加和删除路由
在 CentOS 上添加和删除路由 要在 CentOS 上添加和删除路由,你可以使用 ip 命令或修改网络配置文件。以下是使用 ip 命令的方法: 添加路由: ip route add <目标网络> via <网关> dev <接口>例如: ip route add 192.168.10.0/24 via 192.168.1.1 dev eth…...
2023年电大秋季招生截止日期 什么时候开始报名
2023年电大网上报名时间为3月份和9月份截止报考,电大每年可以报考两次,春季开始报名时间为12月份左右开始,秋季报名时间预计在6月份左右开始。 2023电大网上报名时间是什么时候 电大报名分为春季和秋季两个季节,一般春季招生时间为…...
滑动窗口问题
给定一个大小为 n≤106 的数组。 有一个大小为 k的滑动窗口,它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子: 该数组为 [1 3 -1 -3 5 3 6 7],k为 3。 窗口位置最小值最…...
电子合同网页预览盖章效果实现
电子合同在现在应用越来越广,需求也就随之产生。 本篇文章主要记录两种网页盖章效果实现方式,自己记录一下, 也给需要的人提供一点思路和帮助。 效果 目录 JqueryCSS实现 原理 1.设置印章图片并隐藏 2.标记盖章位置元素 3.获取目标元素位…...
棋盘覆盖问题
文章目录 棋盘覆盖程序设计程序分析棋盘覆盖 【问题描述】 在一个2k x 2k ( 即:2^k x 2^k )个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方…...
[CISCN2023]unzip
[CISCN2023]unzip 环境搭建 1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><form method"post" action"1.php" en…...
基于Html5的在线资料库的设计与实现(asp.NET,SQLServer)
在线资料库系统采用.NET开发平台进行开发,开发工具采用Microsoft Visual Studio 2010集成开发环境,后台编程语言采用C#编程语言来进行编程开发,数据库我们采用当下流行的SQL Server 2008数据库管理系统来存放平台中的数据信息,整个…...
【Vue】二:Vue核心处理---计算属性 监视属性
文章目录 1.计算属性示例2. 监听属性3.补充 1.计算属性示例 实际上计算属性与methods中定义方法基本上没有什么区别,只是计算属性基于响应式依赖缓存,只要数据没有发生改变,计算属性从缓存中取值,只有当数据发送改变,才…...
Apprise:一个库统治所有推送通知平台的终极解决方案
Apprise:一个库统治所有推送通知平台的终极解决方案 前言 在日常开发与运维工作中,我们经常需要将系统状态、告警信息或业务事件通过各种渠道推送给相关人员——可能是 Telegram、企业微信、钉钉、邮件,也可能是 Slack、Discord 或 PushBulle…...
个人创作者利器:AI净界RMBG-1.4,3秒完成以往30分钟的手动精修
个人创作者利器:AI净界RMBG-1.4,3秒完成以往30分钟的手动精修 1. 为什么你需要AI净界RMBG-1.4? 作为一名内容创作者,你是否经常遇到这些困扰: 拍摄的产品照片背景杂乱,需要花费大量时间手动抠图精心设计…...
palworld-host-save-fix:跨环境存档迁移的技术突破与实践指南
palworld-host-save-fix:跨环境存档迁移的技术突破与实践指南 【免费下载链接】palworld-host-save-fix 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-host-save-fix 一、问题溯源:幻兽帕鲁存档迁移的核心挑战 核心价值:深…...
Python程序设计期末考试高频大题精讲:二维列表数据处理实战与深度解析
Python程序设计期末考试高频大题精讲:二维列表数据处理实战与深度解析 摘要:本文以高校计算机科学与技术专业《Python程序设计》期末考试中一道典型大题——“统计学生捐款次数”为切入点,系统讲解二维列表(嵌套列表)的…...
利用快马平台与openclaw切换模型功能,快速构建待办事项应用原型
最近在尝试快速构建一个待办事项应用的原型时,发现InsCode(快马)平台的AI代码生成功能特别适合这种场景。通过平台内置的openclaw切换模型功能,可以快速比较不同AI模型生成的代码风格差异,大大缩短了原型开发周期。下面分享下我的实践过程&am…...
阿里达摩院GTE中文向量模型效果展示:中文方言书面语语义对齐能力验证
阿里达摩院GTE中文向量模型效果展示:中文方言书面语语义对齐能力验证 1. 模型核心能力概览 GTE (General Text Embeddings) 是阿里达摩院推出的通用文本向量模型,专门针对中文场景深度优化。这个模型最大的特点是将文本转换为高质量的1024维向量表示&a…...
告别重复造轮子:用快马AI一键生成无名小站高效开发模板
作为一个经常需要快速搭建小型网站的后端开发者,我最近发现了一个能极大提升开发效率的方法——用InsCode(快马)平台的AI生成功能来创建可复用的基础模块代码。今天就以"无名小站"的后台管理系统为例,分享我的实践心得。 为什么需要代码生成工…...
避坑指南:Maya LiveLink插件安装常见报错解决方案(附FBX传输优化技巧)
Maya LiveLink插件避坑实战:从安装报错到FBX传输优化的全流程指南 每次打开Maya准备大干一场时,那个熟悉的.mll加载失败弹窗就像个不速之客——特别是当你需要在截止日期前完成虚幻引擎的动画对接时。作为连接Maya与虚幻引擎的神经中枢,LiveL…...
告别‘千人千脑’:用DMMR模型搞定EEG情感识别的跨被试难题(附PyTorch代码)
突破脑电情感识别的个体差异壁垒:DMMR模型实战指南与PyTorch实现 当你在实验室里看着屏幕上跳动的脑电波形时,是否曾为不同受试者数据间的巨大差异而头疼?这种被称为"脑电指纹"的个体特异性,一直是情感识别领域最棘手的…...
给AI模型‘打补丁’:用‘上下文提示’和‘查询分解’两招,轻松提升多模态大模型的抗攻击能力
多模态大模型防御实战:用上下文提示与查询分解抵御图像对抗攻击 当你在社交媒体上传一张"猫"的照片,AI系统却识别为"狗"——这种看似无害的错误在医疗影像分析或自动驾驶场景中可能引发灾难。2024年CVPR会议揭示了一个关键发现&…...
