当前位置:网站首页>GO错误处理方式
GO错误处理方式
2022-08-01 06:46:00 【dj1540225203】
Go 的错误处理和其他主流的编程语言如 Java、C# 等不同:
- Go 内置错误不包含堆栈跟踪
- 没有异常,只有错误
- 不支持 try/catch 方式捕获
错误类型
Go 中的错误类型实现为如下接口:
type error interface {
Error() string
}
复制代码所以,Go 的错误类型就这么简单,只要是任何实现 Error() 方法的东西,返回信息是字符串类型即可。
那么,我们可以轻松自定义错误,可以通过两种方式构建错误:
1、Go 的内置错误 errors
2、 fmt 包即时构建错误,将错误信息输出
实现 Demo 如下
自定义错误机制
package main
func customErr() error {
return errors.New("server not work")
}
func customErr2() error {
host := "http://localhost:2033"
fmt.Errorf("server %s set up fail", host)
}
复制代码最佳处理错误方式
所以,在处理错误时通过判断 err 参数来处理错误:
result, err := doHandler()
if err != nil {
// handle error
}
复制代码当处理比较多业务逻辑时,可能调用很多方法,这时就会处理一大堆的 err,如下所示:
func doHandler(){
res, err := getA()
if err!=nil {
// handle getA error
}
err := getB()
if err!=nil {
// handle getB error
}
err := getc()
if err!=nil {
// handle getc error
}
}
复制代码每个方法都需要判断 error 。可能会觉得上述代码不够优雅且浪费代码,但这就是 Go 的代码。
预定义错误
Go 中对预期内的错误,定义相对的错误处理,这样方便在代码的其他部分显式的检查他们,遇到这种错误只需要执行不同的代码分支即可。
var (
NotFoundError = errors.New("未找到参数")
ForbiddenError = errors.New("权限不足")
)
func doHandler(){
if userId == ''{
return NotFoundError
}
}
复制代码预定义错误,只能处理自己定义该类型的错误场景。且在使用时,必须通过和预期的值进行比较判断。这种关联性太强,局限性太大。
自定义错误类型
返回错误时,可能需要携带额外的错误字段或者其他的错误信息,而不是单独的返回错误字符串。通过自定义错误类型,可以让我们错误信息包含更多的信息。
type CustomError struct {
UserId string
Message string
}
func (e * CustomError) Error() string{
return fmt.Sprintf("%s : %s", e.UserId, e.Msg)
}
复制代码CustomError 实现了 Error 接口,我们可以使用 error.As 或者使用类型断言(err.(type)) 来检查标准错误并将其转换为更具体的错误。
和预定义错误相比,自定义错误能够包装底层错误以提供更多的上下文,但是同样会将错误类型暴露出去。
不透明错误
前面2种会暴露错误类型给外部,所以可以将通过提供给不公开的接口,仅暴露具体的错误方法,
type serverError interface {
default() bool
}
func NotFoundError(err error) bool {
m,ok := err.(serverError)
return ok && m.default()
}
复制代码以上只提供具体错误方法,返回错误,暴露错误判定接口,不返回类型。通过断言错误实现特定的行为,而不是断言错误是特定的类型或值。这种错误处理方式相对于灵活。
作者:六号积极分子
链接:https://juejin.cn/post/7123843734717857828
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
边栏推荐
- 七、MFC序列化机制和序列化类对象
- 从购买服务器到网站搭建成功保姆级教程~超详细
- Windows taskbar icon abnormal solution
- leetcode43 字符串相乘
- flinkcdc对mysql的date字段类型转化有什么解决思路么
- Xiaobai's 0 Basic Tutorial SQL: An Overview of Relational Databases 02
- 字符中的第一个唯一字符
- Bean的生命周期
- "By sharing" northwestern university life service | | bytes a second interview on three sides by HR
- 图像基本操作的其他内容
猜你喜欢

爬虫基本原理介绍、实现以及问题解决

数据湖:数据同步工具NiFi

数据机构----线性表之单向链表

信息系统项目管理师必背核心考点(五十六)配置控制委员会(CCB)的工作
![Explosive 30,000 words, the hardest core丨Mysql knowledge system, complete collection of commands [recommended collection]](/img/7f/08b323ffc5b5f8e3354bee6775b994.png)
Explosive 30,000 words, the hardest core丨Mysql knowledge system, complete collection of commands [recommended collection]

MySQL row locks and gap locks

Induction jian hai JustFE 2022/07/29 team, I learned the efficient development summary (years)

响应式织梦模板园林花卉类网站

Flip letters using string container

「游戏引擎 浅入浅出」4.1 Unity Shader和OpenGL Shader
随机推荐
MVVM项目开发(商品管理系统一)
Practical training Navicat Chinese and English mode switching
基于MATLAB的BP神经网络进行语音特征信号分类
matlab wind speed model wavelet filtering
return; represents meaning
Vsce package after the Command failed: NPM list - production - parseable - the depth = 99999 - loglevel = error exception
The Bean's life cycle
头歌MySQL数据库实训答案 有目录
I have three degrees, and I have five faces. I was "confessed" by the interviewer, and I got an offer of 33*15.
目标检测概述-上篇
Causes and solutions of lock table
Solve the problem of page flicker caused by browser scroll bars
【翻译】确保云原生通信的安全:从入口到服务网及更远的地方
return;代表含义
Create, modify and delete tables
第6章——数据库的安全性
CSP-S2019 Day1
从零开始—仿牛客网讨论社区项目(一)
字符中的第一个唯一字符
2022年牛客多校第四场补题