【go从零单排】error错误处理及封装

挪威特罗姆瑟夜景

🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

📗概念

在 Go 语言中,error 是一个内置的接口类型,用于表示错误情况。Go 的错误处理机制与许多其他编程语言不同,它强调显式的错误处理,而不是使用异常机制。

💻代码

package main

//导入errors包和fmt包
import (
	"errors"
	"fmt"
)

// 函数f,输出一个int,输出一个int,一个error
// 函数接受一个整数 arg,如果 arg 等于 42,则返回一个错误;否则返回 arg + 3 和 nil(表示没有错误)
func f(arg int) (int, error) {
	if arg == 42 {
		//errors.New创建一个error的实例
		return -1, errors.New("can't work with 42")
	}

	return arg + 3, nil
}

// 定义了两个错误变量 ErrOutOfTea 和 ErrPower,用于表示特定的错误情况
var ErrOutOfTea = fmt.Errorf("no more tea available")
var ErrPower = fmt.Errorf("can't boil water")

func makeTea(arg int) error {
	if arg == 2 {
		return ErrOutOfTea
	} else if arg == 4 {
		// %w 用于包装 ErrPower 错误
		return fmt.Errorf("making tea: %w", ErrPower)
	}
	return nil
}

func main() {
	for _, i := range []int{7, 42} {
		//r, e := ...这是 Go 语言中的多重赋值语法。调用 f(i) 的结果会被同时赋值给两个变量
		//这个条件用于检查 e 是否为 nil。在 Go 中,nil 表示没有错误
		//if r, e := f(i); e != nil 这种写法将会很常见,在if语句中检查错误判断
		if r, e := f(i); e != nil {
			fmt.Println("f failed:", e) //e 不为 nil,则表示函数 f 在执行过程中发生了错误,抛出错误
		} else {
			fmt.Println("f worked:", r)
		}
	}
	//for 循环i=range 5
	for i := range 5 {
		if err := makeTea(i); err != nil {
			//判断error的各种特定类型
			if errors.Is(err, ErrOutOfTea) {
				fmt.Println("We should buy new tea!")
			} else if errors.Is(err, ErrPower) {
				fmt.Println("Now it is dark.")
			} else {
				fmt.Printf("unknown error: %s\n", err)
			}
			continue
		}

		fmt.Println("Tea is ready!")
	}
}
//输出$ go run errors.go
//f worked: 10
//f failed: can't work with 42
//Tea is ready!
//Tea is ready!
//We should buy new tea!
//Tea is ready!
//Now it is dark.

🔍几种创建error的方式

errors.New

import "errors"

err := errors.New("this is an error")

fmt.Errorf

import "fmt"

err := fmt.Errorf("an error occurred: %s", "details")

自定义错误类型

type MyError struct {
    Message string
    Code    int
}

func (e *MyError) Error() string {
    return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
}

检查error

func doSomething() error {
    // 可能会发生错误的操作
    return errors.New("an error occurred")
}

func main() {
	//检查错误
    if err := doSomething(); err != nil {
        fmt.Println("Error:", err)
    }
}

包装error

Go 1.13 引入了错误包装的概念,可以使用 %w 占位符来创建一个新的error,并将原始error包含在其中。

func doSomething() error {
    return fmt.Errorf("failed to do something: %w", errors.New("original error"))
}

// 在调用处检查原始错误
if err := doSomething(); err != nil {
    if errors.Is(err, errors.New("original error")) {
        fmt.Println("Handled the original error")
    }
}

常用的error处理模式

if errors.Is(err, specificError) {
    // 处理特定错误
}

var myErr *MyError
if errors.As(err, &myErr) {
    // 处理自定义错误
}

go中的error接口

error只有一个方法 Error(),返回一个字符串,描述错误的原因

type error interface {
    Error() string
}

定制自己的error类参考

package main

//import errors包
import (
	"errors"
	"fmt"
)

// 自定义struct,建议命名为argError,后缀为Error
type argError struct {
	arg     int
	message string
}

// 定义Error方法,输入argError指针,返回一个Error() string ,符合error方法的要求
func (e *argError) Error() string {
	//d 表示一个整数,在这里是 e.arg,%s 表示一个字符串(在这里是 e.message)
	return fmt.Sprintf("%d - %s", e.arg, e.message)
}

// 定义f函数,输入int,输出一个int,一个error
func f(arg int) (int, error) {
	if arg == 42 {
		//返回-1和一个指向 argError 实例的指针
		return -1, &argError{arg, "can't work with it"}
	}
	return arg + 3, nil
}

func main() {

	_, err := f(42)
	//声明一个指向 argError 类型的指针变量 ae,初始值为 nil
	var ae *argError
	//errors.As 函数用于检查 err 是否是 argError 类型的错误。如果是,它会将 err 转换为 *argError 类型,并赋值给 ae。
	if errors.As(err, &ae) {
		fmt.Println(ae.arg)
		fmt.Println(ae.message)
	} else {
		fmt.Println("err doesn't match argError")
	}
}

💡 Tips小知识点

  • 显式错误处理:Go 强调显式错误处理,鼓励开发者在每个可能失败的操作后检查错误
  • 简单易用:error 接口简单,易于使用,适合于快速开发和维护。
  • 灵活性:通过错误包装和自定义错误类型,Go 提供了灵活的错误处理机制,合理运用能够更好地管理和调试错误。
  • 按照惯例,错误一般是最后一个返回值

💪无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能】阿里云PAI平台DSW实例一键安装Python脚本

阿里云的DSW实例自带的镜像很少而且并不好用,所以我在这里写三个一键编译安装Python3.8,Python3.9,Python3.10的Shell脚本。 安装Python3.8 wget https://www.smallbamboo.cn/install_python38.sh && chmod x install_python38.sh …

【TS】九天学会TS语法——1.TypeScript 是什么

💯 欢迎光临清清ww的博客小天地💯 🔥 个人主页:【清清ww】🔥 📚 系列专栏:vue3 | TypeScript 📚 🌟 学习本无底,前进莫徬徨。🌟 开始学习 目录 一、TypeScript 简介 1.Ja…

comfyUI官方笔记整理

官网教程笔记ComfyUI_examples 1.ComfyUI基础教程ComfyUI Basic Tutorial VN 从网上下载下来的模型ckpt和safetensors包含有3个不同的模型,CLIP,主模型还有VAEclip模型会和CLIPTextEncode进行连接,将文本编码为模型可以理解的向量形式。在S…

《数据治理精选案例集2.0(2024版)》592页PDF(已授权分享)

《亿信华辰数据治理精选案例集2.0》是北京亿信华辰软件有限责任公司倾力打造的专业数据治理案例集,汇集了100个一线政企数据治理实践案例,覆盖13大行业和500业务场景,通过深入剖析数据治理难题,提供了新思路和实战经验&#xff0c…

​通过人工智能技术实时识别安全着装规范、作业规范、设备状态、环境安全的智慧物流开源了。

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。构建基于Ai技术的…

喜报!景联文科技成功通过DCMM数据管理能力成熟度二级认证

10月30日,中国电子信息行业联合会公示了新一批DCMM贯标企业,景联文科技成功通过DCMM数据管理能力成熟度二级认证(乙方认证)。 DCMM是《数据管理能力成熟度评估模型》的简称,是我国在数据管理领域首个正式发布的国家标准…

【linux学习指南】磁盘分区挂载到目录,形成文件系统挂载点

文章目录 📝前言🌠 查看系统分区🌉制作一个大的磁盘块,就当做一个分区🌉格式化写入文件系统🌉将分区挂载到指定的目录🌉在分区重创建文件🌉卸载分区🌉分区挂载到目录才能…

Jenkins声明式Pipeline流水线语法示例

系列文章目录 docker搭建Jenkins2.346.3版本及常用工具集成配置(ldap、maven、ansible、npm等) docker安装低版本的jenkins-2.346.3,在线安装对应版本插件失败的解决方法 文章目录 系列文章目录jenkins流水线基础1、pipeline1.1、什么是pipeline?1.2、为什么使用pi…

python机器人Agent编程——实现一个本地大模型和爬虫结合的手机号归属地天气查询Agent

目录 一、前言二、准备工作三、Agent结构四、python模块实现4.1 实现手机号归属地查询工具4.2实现天气查询工具4.3定义创建Agent主体4.4创建聊天界面 五、小结PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源ps3.wifi小车控制相关…

uni-app打包后报错云服务空间未关联

使用uni-app打包到h5 项目里面用到了uni-app的云端一体城市选择组件,这个组件数据用到了uniCloud云服务空间,在本地运行没问题,打包之后测试环境报错: 一顿查,查到了官网是这样说的: cli publish --platfo…

SpringBoot框架:共享汽车行业的技术升级

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了共享汽车管理系统的开发全过程。通过分析共享汽车管理系统管理的不足,创建了一个计算机管理共享汽车管理系统的方案。文章介绍了共享汽车管理系统的系…

DBAPI连接阿里云 maxcompute 报错

使用正确的驱动包 访问以下链接寻找驱动包 https://github.com/aliyun/aliyun-odps-jdbc/releases/tag/v3.4.3 注意要使用odps-jdbc-3.4.3-jar-with-dependencies.jar ,这个是完整的jar包 不要使用odps-jdbc-3.4.3.jar,这个不是完整的,它还…

【数据集】【YOLO】【目标检测】树木倒塌识别数据集 9957 张,YOLO道路树木断裂识别算法实战训练教程!

一、数据集介绍 【数据集】树木倒塌识别数据集 9957 张,目标检测,包含YOLO/VOC格式标注。 数据集中包含1种分类:{0: fallen_tree},代表倒塌或者断裂的树木。 数据集来自国内外图片网站和视频截图; 可用于无人机树木…

贪心算法day2(最长递增子序列)

目录 1.最长递增子序列 方法一:动态规划 方法二:贪心二分查找 1.最长递增子序列 链接:. - 力扣(LeetCode) 方法一:动态规划 思路:我们定义dp[i]为最长递增子序列,那么dp[j]就是…

基于微信小程序的电子购物系统的设计与实现(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高,而用户手机需要安装各种APP软件,因此占用用户过多的手机存储空间,导致用户手机运行缓慢,体验度比较差,进而导致用户会卸载非必要的APP,倒逼管理者必须改…

雨晨 23H2 Windows 11 企业版 IE VCDX 适度 22631.4445 (VIP有限开放版本)

雨晨 23H2 Windows 11 企业版 IE VCDX 适度 22631.4445 (VIP有限开放版本) 文 件: 雨晨 23H2 Windows 11 企业版 适度 22631.4445 install.wim 提 取 码: ZZLR 大 小: 2824999564 字节 修改时间: 2024年11月9日, 星期六, 05:33:05 MD5 : 9C88…

OWASP TOP10 OSS 风险:开源软件安全指南

OWASP OSS 列表提供了旨在绕过 CVE 目录等滞后指标的建议,并为安全从业者提供了安全使用 OSS 组件的指南。 在最近的一些暴露的漏洞和风险之后,对开源软件 (OSS)的安全和使用方式进行批判性审视的呼声越来越高,特别是 …

无人机培训机型有哪些?CAAC考证选3类还是4类

无人机培训是一个涵盖多个方面的综合性过程,旨在培养具备无人机操作技能和相关知识的人才。 无人机培训机型 无人机培训通常涵盖多种机型,以满足不同领域和应用场景的需求。常见的无人机培训机型包括: 1. 多旋翼无人机:也称为多…

浏览器漫谈HTML--2.1印象深刻的标签-语义化标签

语义化标签 HTML语义化标签是HTML5引入的一个重要特性 常见的语义化标签&#xff1a; <header>, <nav>, <main>, <article>, <section>, <aside>, <footer> 布局如下 底层实现逻辑&&好处 语义化标签其实底层实现逻辑和…

el-table-column prop值根据数组获取

方法一&#xff1a; 可以给el-table-column添加一个属性&#xff1a;formatter&#xff0c;代码如下&#xff1a; 这里是因为多个列都需要同样的计算&#xff0c;所以使用column.property获取属性&#xff0c;不然可以直接row.属性 方法二&#xff1a; 直接在template scope …