每期一个小窍门: go处理异常的一些小窍门

news/2024/11/8 9:13:17/

go设计者更偏向于C的error处理方式, 快速失败是更简单高效的

我们可以利用error接口和多返回值来实现异常传递

error可以利用变量来复用 等价判断

var outOfRangeError = errors.New("number out of range")
var unknownError = errors.New("unknown type error")func doSomeThing01(i interface{}) (string, error) {switch value := i.(type) {case int:if value > 10 {return "wrong", outOfRangeError}return " integer", nilcase string:return " string", nildefault:return " unknown", unknownError}}

判断异常时, 异常逻辑在前, 即使有复杂业务逻辑判断, 也同样是扁平结构

func TestDoSomething(t *testing.T) {if msg01, err := doSomeThing01(1); err != nil {t.Log(err)} else {t.Log(msg01)}if msg01, err := doSomeThing01(200); err != nil {t.Log(err)} else {t.Log(msg01)}if msg01, err := doSomeThing01(false); err != nil {t.Log(err)} else {t.Log(msg01)}
}

但是也有类似java的异常捕获机制
通过panic抛出
通过defer来获取处理
通过recover使得程序继续运行
但是如果告警做的不好, 或者defer逻辑只是简单的记日志
Just let it crash!
那么更推荐让程序崩溃掉, 然后由运维层的恢复机制告警恢复, 健康检查这样也会检测到异常, 从而更好的解决本质问题

func doSomeThing02(i interface{}) string {defer func() {if err := recover(); err != nil {fmt.Println(err)}}()switch value := i.(type) {case int:if value > 10 {panic(outOfRangeError)}return " integer"case string:return " string"default:panic(unknownError)}}
func TestDoSomething02(t *testing.T) {msg01 := doSomeThing02(1)t.Log(msg01)msg02 := doSomeThing02(200)t.Log(msg02)msg03 := doSomeThing02(false)t.Log(msg03)
}

http://www.ppmy.cn/news/1027824.html

相关文章

NPM与外部服务的集成(上)

目录 1、关于访问令牌 1.1 关于传统令牌 1.2 关于粒度访问令牌 2、创建和查看访问令牌 2.1 创建访问令牌 在网站上创建传统令牌 在网站上创建粒度访问令牌 使用CLI创建令牌 CIDR限制令牌错误 查看访问令牌 在网站上查看令牌 在CLI上查看令牌 令牌属性 1、关于访问令…

视频分辨率: UXGA/SVGA/VGA/QVGA/QQVGA

视频分辨率除了常见的720p/2K/4K外, 还有VGA系列的分辨率 相关字段含义: V——Video (视频) G——Graphics(图像) A——Array(阵列) S——Super(超级) X——Extended(扩展) U——Ultra(终极) W——Wide&am…

c++ 有元

友元分为两部分内容 友元函数友元类 友元函数 问题&#xff1a;当我们尝试去重载operator<<&#xff0c;然后发现没办法将operator<<重载成成员函数。因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作 数了。…

利用python实现网络设备配置批量上传和批量下载功能

利用python实现网络设备配置批量上传和批量下载功能 利用ensp实现网络设备和物理主机互通配置网络设备配置批量上传功能配置批量下载功能常见问题 提示&#xff1a; 本文章代码所使用目录均使用相对目录&#xff0c;只需将配置存放目录和文件下载目录&#xff08;已用符号标出…

【Lua基础入门】解密世界上最快的脚本语言

文章目录 前言一、Lua简介二、Lua功能三、安装LuaUbuntu LinuxWindows安装Lua 四、第一个Lua程序总结 前言 Lua是一种轻量级、快速且可嵌入的脚本语言&#xff0c;广泛应用于游戏开发、嵌入式系统、脚本扩展等领域。它的设计目标是简单、高效、可定制和易于集成。本文将介绍Lu…

易服客工作室:Elementor AI简介 – 彻底改变您创建网站的方式

Elementor 作为领先的 WordPress 网站构建器&#xff0c;是第一个添加本机 AI 集成的。Elementor AI 的第一阶段将使您能够生成和改进文本和自定义代码&#xff08;HTML、自定义代码和自定义 CSS&#xff09;。我们还已经在进行以下阶段的工作&#xff0c;其中将包括基于人工智…

SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系

SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系 1 SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系 1 SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系 https://www.swrjzxw.com/1556.html SolidWorks装配体时 显示 不能使用选择如允许此选…

Mac下全选,使用pynput,怎样调用command键?

Key.command 不行&#xff0c;用Key.cmd 。 win或linux下&#xff1a; with keyboard.pressed(Key.ctrl):keyboard.press(a)time.sleep(1)keyboard.release(a) 那么在mac下就是&#xff1a; with keyboard.pressed(Key.cmd):keyboard.press(a)time.sleep(1)keyboard.rel…