前段时间准备对线上一个golang系统服务进行内部开源,对代码里面的错误处理进行了一波优化。

优化的几个原因:

  • 错误处理信息随意,未分类未定义。看到错误日志不能第一时间定位
  • 错误的日志重复,有时候一个错误经过了好几层,每一层都会记录,导致日志混乱
  • 错误处理不统一,使用不统一,管理也不统一

优化的解决办法:

  • 对错误进行分类,统一定义和使用
  • 每一个错误都有冒泡到包的顶层,处理与记日志。使用方只需定义好自己的信息

实施过程

错误分类:函数级,包模块级,系统api级。

函数级别:

还是采用 err != nil 的形式,并且做一个如下的包装。

模块级别

统一返回到对应的goroutine顶层处理

服务对外级别

适当的code和健名的message

底层错误级别

考虑及时panic,暴露有用信息

以下为代码设计:

点击查看代码
package ferrors

import (
"fmt"
"golang.org/x/xerrors"
) //Errors 新的错误处理方式
type Errors struct {
Code int64
Msg string
} // Error 输出错误信息
func (e Errors) Error() string {
return fmt.Sprintf("code: %d msg: %s at: %s", e.Code, e.Msg, "错误位置,堆栈信息,可选")
} // New 创建自定义错误
func New(code int64, str string, arg ...interface{}) *Errors {
if len(arg) > 0 {
str = fmt.Sprintf(str, arg...)
}
return &Errors{Code: code, Msg: str}
} // newErr 创建通用错误
func newErr(code int64, err error) *Errors {
switch err := err.(type) {
case *Errors:
return err
case nil:
return &Errors{Code: code, Msg: ""}
default:
return &Errors{Code: code, Msg: err.Error()}
}
}
func NewErrNotFound(err error) error {
return newErr(CodeMkNotFound, err)
} // ErrorEcho example:使用 error wrapping
func ErrorEcho(err error) string { return fmt.Sprintf("the error %w", err)
} //ErrorDump example: xerrors 打印堆栈信息
func ErrorDump() {
err := foo1()
fmt.Printf("%v\n", err)
fmt.Printf("%+v\n", err)
} var myError = xerrors.New("myerror") func foo() error {
return myError
}
func foo1() error {
return xerrors.Errorf("foo1 : %w", foo())
}

go 错误处理设计思考的更多相关文章

  1. 用thinkphp进行微信开发的整体设计思考

    用thinkphp进行微信开发的整体设计思考 http://www.2cto.com/weixin/201504/388423.html 2015-04-09      0个评论       作者:明 ...

  2. Atitit. null错误的设计 使用Optional来处理null

    Atitit. null错误的设计 使用Optional来处理null 然后,我们再看看null还会引入什么问题. 看看下面这个代码: String address = person.getCount ...

  3. 2018.8.3 Java中容易犯错误的问题思考与总结

    Java容易犯错误的问题思考 float型 float f = 3.4 是否正确 不正确,应该用强制类型转换.如下所示:float f = (float)3.4 或float f = 3.4f 在ja ...

  4. Java实现本地小数据量缓存尝试与实践&设计思考

    话不多说先贴代码 /** * 缓存工具 */ public class ConcurrentHashMapCacheUtils{ /** * 当前缓存个数 */ public static Integ ...

  5. 深究带PLL的错误复位设计

    PLL复位通常犯的错误 或者是像上一篇文章 FPGA知识大梳理(四)FPGA中的复位系统大汇总  中的图一样,也是错误设计.为何呢?看ALTPLL (Phase-Locked Loop) IP Cor ...

  6. Extjs的架构设计思考,单页面应用 or 多页面?

    写在前面:不要认为 EXTJS 高版本就是一个界面改良,在项目中,仍然用 N 张页面,在 N 张页面部署 EXTJS .这种方式不用多讲,效率问题大家都看得出来, EXTJS 是一个集成开发工具,注定 ...

  7. RESTful API 设计思考

    RESTful API 设计思考,内容来源网络加自己的思考 1.RESTful Web API采用面向资源的架构:同一的接口,所以其成员体现为针对同一资源的操作2.SOAP Web API采用RPC风 ...

  8. 比原链设计思考: 扩展性UTXO模型

    用户模型是比原链在最初就需要确定的重要数据结构, 团队的选择还是聚焦在两种典型的模型系统中,Account模型和UTXO模型,和其他大多数区块链设计一样, 选择了模型就决定了协议层的重要实现,两种模型 ...

  9. ​游戏设计思考:对COK的理解和思考

    转自:http://www.gameres.com/804983.html 一.前言 发此文的起因是最近加入了一个游戏研究群,受到大家对游戏研究热情的感染,也想将自己对游戏的理解和感悟发出来和大家一起 ...

随机推荐

  1. Spatial Statistics Tools(空间统计工具)

    空间统计工具 1.分析模式 # Process: 增量空间自相关 arcpy.IncrementalSpatialAutocorrelation_stats("", "& ...

  2. 【NOIP1998】 三连击 题解

    文章转载前需和原作者联系,否则追究法律责任 题目链接:https://www.luogu.com.cn/problem/P1008 首先我们来分析一下题目.要求是枚举三个数,比例为1:2:3,且各个数 ...

  3. CAM对象样式表

    CAM对象样式表 121 160 UF_machining_task_type UF_mach_order_task_subtype 112 UF_machining_null_grp_type 无 ...

  4. DataX的安装及使用

    DataX的安装及使用 目录 DataX的安装及使用 DataX的安装 DataX的使用 stream2stream 编写配置文件stream2stream.json 执行同步任务 执行结果 mysq ...

  5. 编程题:X星人的金币

    X星人的金币 时问限制:3000MS 内存限制:589824KB 题目描述: X是人在一艘海底沉船上发现了很多很多很多金币.可爱的X星人决定用这些金币来玩一个填格子的游戏.其规则如下:第1个格子放2枚 ...

  6. 【原创】Linux v4l2框架分析

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  7. vue3.x异步组件

    在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块 vue2.x 曾经简单的异步组件 components: { AsyncComponent: () =& ...

  8. .net 5.0 ref文件夹的作用

    ref目录里的dll是一个名为参考组件的东西,微软MSDN给的解释是 参考组件是一种特殊类型的程序集,仅包含表示库的公共API面所需的最小元数据数量.它们包括用于在构建工具中引用程序集时重要的所有成员 ...

  9. 移动端 h5 uniapp 读,写,删本地文件或sd文件

    移动端 h5 uniapp 读,写,删本地文件或sd文件 应用场景: 当我们需要做离线应用或者是加载本地文件时使用到此方法.(本篇文章给大家分享访问app私有文件目录,系统公共目录,sd外置存储的文件 ...

  10. 数字孪生 3D 科技馆的科学传播新模式

    前言 科技馆是一种参与型体验型的博物馆,以传播科学知识.培养公众的科学创新技术为宗旨,并以其生动的展现方式得到公众的广泛欢迎.一直以来,我国科技馆的发展受到各种因素的制约和影响,发展缓慢.如今在我国经 ...