Go语言编程思想3——错误处理和资源管理

2023-10-31

Go语言编程思想3——错误处理和资源管理

资源管理:及时关闭文件,及时释放资源,如果打开的文件还未关闭就因为出错而在中间跳出,就无法保证有效的资源管理,因此在这里两者一起进行考虑

一、defer调用

  • 调用在函数结束时发生(在return/panic之前执行)
  • 参数在defer语句时计算
  • defer列表为先进后出(先defer的后执行)
func tryDefer() {
	for i := 0; i < 100; i++ {
		defer fmt.Print(i," ")
		if i == 30 {
			panic("printed too many")
		}
	}
}
//执行结果:30 29 28 27 26 25 ... 3 2 1 0
//退出的时候i是30,但不会全部输出30, i是在执行defer语句时的值

Ex. 将前20个斐波那契数列输出到文件

func writeFile(filename string) {

	file, err := os.Create(filename) //新建文件
	if err != nil {
		panic(err)
	}
	defer file.Close()              //关闭文件
	writer := bufio.NewWriter(file) //新建bufio.Newwriter
	defer writer.Flush()            //writer需要Flush
	//先运行writer.Flush(),再运行file.close()
	f := fib.Fibonacci()
	for i := 0; i < 20; i++ {
		fmt.Fprintln(writer, f())
	}
}

何时使用defer调用

  • Open/Close
  • Lock/Unlock
  • PrintHeader/PrintFooter

二、错误处理

  • 尽量用error不用panic
  • 意料之中的:使用error。如:文件打不开
  • 意料之外的:使用panic。如:数组越界,如开了大小为n的数组,明明循环最大到n,但是结果越界,出现了意料之外的错误,这时用panic

error的定义

type error interface {
	Error() string
}

将error当做普通的值类型来处理即可

panic会把程序挂掉,尽量少用panic,遇到错误时可以输出提示语句后return

func writeFile(filename string) {
	// 注释表明,OpenFile如果出错那么一定是*PathError
	// 所以对Error进行判断,如果不是*PathError那么就报panic
	file, err := os.OpenFile(filename, os.O_EXCL|os.O_CREATE, 0666)
	if err != nil {
		if pathError, ok := err.(*os.PathError); !ok {
			panic(err)
		} else {
			fmt.Printf("%s,%s,%s\n",
				pathError.Op,
				pathError.Path,
				pathError.Err)
		}
		return
	}
	defer file.Close()              //关闭文件
	writer := bufio.NewWriter(file) //新建bufio.Newwriter
	defer writer.Flush()            //writer需要Flush
	//先运行writer.Flush(),再运行file.close()
	f := fib.Fibonacci()
	for i := 0; i < 20; i++ {
		fmt.Fprintln(writer, f())
	}
}

自建error

	err=errors.New("this is a custom error")

服务器统一错误处理

package filelisting

import (
	"io/ioutil"
	"net/http"
	"os"
	"strings"
)

const prefix = "/list/"

//字符串实现接口
type userError string

func (e userError) Error() string {
	return e.Message()
}
func (e userError) Message() string {
	return string(e)
}

func HandleFileList(writer http.ResponseWriter,
	request *http.Request) error {
	if strings.Index(request.URL.Path, prefix) != 0 {

		return userError("path must start " + "with " + prefix)
	}
	path := request.URL.Path[len(prefix):] // /list/fib.txt
	file, err := os.Open(path)
	if err != nil {
		return err
	}
	defer file.Close()

	all, err := ioutil.ReadAll(file)
	if err != nil {
		return err
	}
	writer.Write(all)
	return nil
}

package main

import (
	"learngo/errhandling/filelistingserver/filelisting"
	"log"
	"net/http"
	"os"
)

type appHandler func(writer http.ResponseWriter,
	request *http.Request) error

//函数式编程,将输入的函数包装成输出函数来输出
func errWrapper(
	handler appHandler) func(
	http.ResponseWriter, *http.Request) {
	return func(writer http.ResponseWriter,
		request *http.Request) {

		defer func() {
			if r := recover(); r != nil {
				log.Printf("Panic:%v", r)
				http.Error(writer,
					http.StatusText(http.StatusInternalServerError),
					http.StatusInternalServerError)
			}
		}()

		err := handler(writer, request)
		//错误处理
		if err != nil {
			log.Printf("Error occurred"+
				"handling request:%s",
				err.Error())
			if userErr,ok:=err.(userError);ok{
				http.Error(writer,
					userErr.Message(),
					http.StatusBadRequest)
				return
			}


			code := http.StatusOK
			switch {
			case os.IsNotExist(err):
				code = http.StatusNotFound
			case os.IsPermission(err):
				code = http.StatusForbidden
			default:
				code = http.StatusInternalServerError
			}
			http.Error(writer,
				http.StatusText(code), code)
		}
	}
}

type userError interface {
	error //给系统看的
	Message() string  //给用户看的
}

func main() {
	http.HandleFunc("/",
		errWrapper(filelisting.HandleFileList),
	)
	err := http.ListenAndServe(":8888", nil)
	if err != nil {
		panic(err)
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go语言编程思想3——错误处理和资源管理 的相关文章

  • Python自动化测试 | 如何使用Robot Framework进行自动化测试?

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 【计算机毕业设计】OA公文发文管理系统_xtv98

    近年来 人们的生活方式以网络为主题不断进化 OA公文发文管理就是其中的一部分 现在 无论是大型的还是小型的网站 都随处可见 不知不觉中已经成为我们生活中不可或缺的存在 随着社会的发展 除了对系统的需求外 我们还要促进经济发展 提高工作效率
  • 2024诸多大厂春招提前启动!Android的程序员还在等什么

    春招 提前批 已开 xdm别打瞌睡了 格力 顺丰 酷狗 沃尔玛中国 理想 科大讯飞等开启春招 开始收简历了 还有hc的企业提前抢人 春招时间短 节奏快 招满即止 就算挂了也绝不能不投 对企业来说 秋招和春招都是储备人才的黄金时期 春招中 除
  • 面试官随便问几个问题就知道你究竟做没做过微信支付宝支付

    面试官随便问几个问题就知道你究竟做没做过微信支付宝支付 你知道直连模式和服务商模式吗 网上的课程一般给你演示的都是直连模式 而企业中有不少是申请成为了服务商 因为里面有佣金提成 我粗俗地解释 直连模式 就是说你是一个会做生意的老板 自己会搞
  • 史上最全Java面试八股文(带全部答案)2024年最新版

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • 计算机Java项目|学生成绩管理系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 计算机Java项目|基于SSM的篮球系列网上商城设计与实现

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 面试官:分库分表后如何生成全局ID?

    分库分表后就不能使用自增 ID 来作为表的主键了 因为数据库自增 ID 只适用于单机环境 但如果是分布式环境 是将数据库进行分库 分表或数据库分片等操作时 那么数据库自增 ID 就会生成重复 ID 从而导致业务查询上的问题 所以此时 可以使
  • 详解Java信号量-Semaphore

    第1章 引言 大家好 我是小黑 今天 咱们一起来深入探讨一下Semaphore 在Java中 正确地管理并发是一件既挑战又有趣的事情 当谈到并发控制 大家可能首先想到的是synchronized关键字或者是ReentrantLock 但其实
  • JCMsuite应用:光学环形谐振腔模拟

    本案程演示了环形谐振腔的模拟 这种类型的集成光子器件 例如用作升 降滤波器或在传感应用中 当物质或粒子附着在环上时 通过测量其共振频率的位移来检测 对于集成光子电路中的无源光器件 s矩阵通常是研究的热点 它描述了通过端口 波导进入设备的电磁
  • 【自适应滤波】一种接近最佳的自适应滤波器,用于突发系统变化研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 详解toLowerCase(判断字符串相等)

    一 toLowerCase 函数简介 toLowerCase 是一个在多个编程语言中都存在的字符串方法 它的作用是将字符串中的所有大写字母转换为对应的小写字母 常用于文本处理 搜索和比较等情况 以确保字符串的一致性和非大小写敏感的操作 二
  • 【go语言】结构体数据填充生成md错误码文件

    这里使用pongo2这个模版引擎库进行md文件渲染 GitHub flosch pongo2 Django syntax like template engine for Go package main import fmt github
  • 【go语言】AST抽象语法树详解&实践之扫描代码生成错误码文档

    背景 为了能识别出代码中抛出错误码的地址和具体的错误码值 再根据错误码文件获取到错误码的具体值和注释 方便后续的排错 这里使用AST进行语法分析获取到代码中的目标对象 一 编译过程 在开始解析代码之前先补充了解一下编译过程 编译过程是将高级
  • 15天学会Python深度学习,我是如何办到的?

    陆陆续续有同学向我们咨询 Python编程如何上手 深度学习怎么学习 如果有人能手把手 一对一帮帮我就好了 我们非常理解初学者的茫然和困惑 大量视频 书籍 广告干扰了大家的判断 学习Python和人工智能 成为内行人不难 为此 我们推出了
  • 【心电图基线估计和去噪方法的群稀疏正则化】带有群稀疏正则化的心电图基线估计和去噪(Matlab实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 2024年华为OD机试真题-分割均衡字符串-Python-OD统一考试(C卷)

    题目描述 均衡串定义 字符串只包含两种字符 且两种字符的个数相同 给定一个均衡字符串 请给出可分割成新的均衡子串的最大个数 约定字符串中只包含大写的 X 和 Y 两种字符 输入描述 均衡串 XXYYXY 字符串的长度 2 10000 给定的
  • 基于节点电价的电网对电动汽车接纳能力评估模型研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • Java开发中不要使用受检异常

    简介 Java是唯一 主流 实现了受检异常概念的编程语言 一开始 受检异常就是争议的焦点 在当时被视为一种创新概念 Java于1996年推出 如今却被视不良实践 本文要讨论Java中非受检异常和受检异常的动机以及它们优缺点 与大多数关注这个
  • SpringCloud Bus动态刷新全局广播

    文章目录 代码地址 配置项目 配置修改 测试 SpringCloud Bus动态刷新定点通知 代码地址 地址 https github com 13thm study springcloud tree main days11 20Bus 配

随机推荐

  • 备战2020,软件测试工程师面试题集锦

    虽然测试行业在2019不太景气 面试后的一些面试题归集和总结 为了将来面试时使用 所有的面试题中我发现超过90 都是基础性的面试题 只要有自动化基础 功能测试接触 再加上面试的时候态度ok 且不卑不亢即可 切记 面试时一定要不卑不亢 切记心
  • OCR识别身份证及营业执照图片(Java版)

    本文基于百度智能云平台提供的OCR识别技术 对身份证图片及营业执照图片识别处理 可以说是全网最详尽可用的教程 希望慢慢食用 准备工作 1 百度智能云官网 百度AI开放平台 全球领先的人工智能服务平台 需注册账号 申请开通应程序 目的是为了得
  • java实现FIFO和LRU页面置换算法

    FIFO是内存管理的一种页面置换算法 FIFO First Input First Output 即先进先出队列 例 在超市购物之后会提着我们满满的购物车来到收银台排在结账队伍的最后 眼睁睁地看着前面的客户一个个离开 这就是一种先进先出机制
  • qt QObject::connect: Parentheses expected,

    出现QObject connect Parentheses expected 这个错是我自己粗心 但也不得不吐槽下qt的不合理设计 connect时槽函数忘记加括号也可以编译通过 而且connect忘记加括号的槽函数是可以接收到信号的 因为
  • C语言 习题3-1 比较大小

    题目要求 本题要求将输入的任意3个整数从小到大输出 输入 输出格式 输入在一行中给出3个整数 其间以空格分隔 输出在一行中将3个整数从小到大输出 其间以 gt 相连 思路 写一个通用的排序函数 排序后再输出 代码 include
  • 解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)的问题。

    问题描述 在运行SpringBoot项目时 出现以下错误 大多原因是一下两个原因 1 在resources文件加下创建的mapper文件夹类型没有正确选择 eclipse选择Folder idea选择Directory 2 映射文件的map
  • CentOs自带mysql卸载时出现无法卸载情况的解决办法

    CentOs自带mysql卸载时出现无法卸载情况的解决办法 首先通过如下命令来查看我们的操作系统上是否已经安装了mysql数据库 rpm qa grep mysql 这个命令就会查看该操作系统上是否已经安装了mysql数据库 发现出现如下情
  • 数据仓库灵魂30问之数据仓库、数据中台、数据湖有什么区别

    先说结论 数据仓库实行分而治之 面向BI 商业智能 数据中台实行一统天下 面向DateAPI 数据服务API 数据湖实行无为而治 面向AI 人工智能 他们三个实行的策略不同 用途不同 但是数据中台可以包容数据仓库与数据湖 数据湖与数据仓库是
  • 2023电子信息工程毕业设计题目选题推荐

    文章目录 1前言 2 如何选题 2 1 嵌入式开发方向 2 2 物联网方向 2 3 移动通信方向 2 4 人工智能方向 2 5 算法研究方向 2 6 移动应用开发方向 2 7 网络通信方向 2 8 学长作品展示 4 最后 1前言 近期不少学
  • sql截去最后一位_SQL截取最后一个由字符分隔的字符串

    SQL如果一个字符串由某个字符分隔 例如 火锅 gt 中餐 gt 极品美食 10 20 300 怎么得到字符最后一个字符串 极品美食 300 使用reverse配合charindex来实现 reverse是把字符串倒置 然后通过charin
  • 终于知道程序员为什么总是带个耳机了!

    能别带耳机吗 你能别来打扰我工作吗 不能 前阵子有篇热文 当一个程序员一天被打扰 10 次 后果很惊人 看后网友都表示深有同感 来看看这些网友都是怎么讲的 热心市民 开发小哥哥旁边放着一个计数器 我好奇的问他这个是记录每天的bug数吗 他说
  • 一分钟带你解决“command not found“报错

    长话短说 command not found 找不到命令 这类错误出现的原因有很多 根据具体情况分析 常见的有以下3种 1 不是可执行命令 也就是你输入的代码不合法 没有被定义 root localhost test jsjsjjdjd b
  • Python读写Excel文件第三方库汇总,你想要的都在这儿!

    恢复内容开始 常见库简介 xlrd xlrd是一个从Excel文件读取数据和格式化信息的库 支持 xls以及 xlsx文件 http xlrd readthedocs io en latest 1 xlrd支持 xls xlsx文件的读2
  • 安全帽识别 安全帽佩戴效果 安全帽检测 yolov4安全帽识别 yolov3

    施工场景下的行为识别领域 该应用领域在技术上可拆分为两部分 视频跟踪和行为识别 这一周密集调研了文献 发现着实是一个大坑 其中的视频跟踪最近的各頂会论文出现最多的是单目标跟踪 而我们要解决的确是多目标跟踪 最近出的较好的能实用性的是deep
  • react+umi+antdesign+typescript从零构建后台系统

    确保电脑有node 查看方式 node v 2 确保电脑有umi 查看方式 umi v 没有umi的安装方式 npm install g umi 3 执行以下代码 npm create umi 文件名 或者 yarn create umi
  • 不要在问了!工作六年总结的Java面试题与经验

    前言 最近看到很多小伙伴都在因为面试烦恼 所以小编总结了一些面试经验 希望能帮助到大家 一 面试到底在问些什么东西 首先你要知道 面试官的提问和你简历上写的内容是紧密联系的 所以你简历上写的技能一定要会 一般面试包括下面几方面知识类型 Ja
  • 解决[Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘validate‘ of undefined“

    在做前后端登录时出现下列错误 解决如下 this refs loginForm validate 中的与ref loginForm 名字要相同 或者要定义这个ref 没有定义或者名称不一致都会出现上述错误
  • 你的数字藏品可能真的只是一张图片

    国外 NFT 市场的火爆也同样引燃了国内的市场 像腾讯 阿里等诸多大厂纷纷入局 同时 大量中小企业也在这些头部企业的带领下聚集而来 出于政策风险隐患的防范要求 国内的区块链并不是国外的公链 而是由一个或多个机构独立部署的联盟链 同时也将 N
  • CMD查看当前文件路径下的所有文件名

    介绍 我们知道Linux系统下查看当前文件路径下的所有文件名 可以用ls或ll来查看 那么CMD中怎么查看当前路径下的所有文件呢 方案 使用 dir 命令即可 效果如下
  • Go语言编程思想3——错误处理和资源管理

    Go语言编程思想3 错误处理和资源管理 资源管理 及时关闭文件 及时释放资源 如果打开的文件还未关闭就因为出错而在中间跳出 就无法保证有效的资源管理 因此在这里两者一起进行考虑 一 defer调用 调用在函数结束时发生 在return pa