对于一门编程语言的开发者,类库包管理是一项考核编程语言成熟度的重要指标之一,Golang也不例外。笔者在日常使用Golang语言开发系统程序时发现,在Golang的世界里,存在着大量的技术实现讨论和各种自制的解决方案。
最近在开发去项目,发现去语言本身存在的错误并没有像触发恐慌时显示详细的调试信息。对于复杂的系统而言,这会让我们开发者需要一定的时间才能定位到错误,所以我们基本上本身的错误封装了一个可以快速定位错误工具包。下面让我们来看看这个工具包是怎么实现的。
-
<李>工具包提供犯错和Errf两个完善来登记错误,其用法分别类似于fmt.Print和fmt.Printf的使用方式,在参数的定义中添加了innerError参数来实现错误的传递,其值可为零。李>
<李>对外提供加函数,方便使用者获取错误产生的堆栈信息。李>
<李>通过SetConfig方式实现对错误信息显示的配置,如在生产环境不需要打印堆栈信息。通过响应的配置即可关闭。李>
工具包中主要是对堆栈信息的处理,就是如何才能定位到错误的产生位置,通过查看官方文档,我们发现通过运行时包中的调用者和CallersFrames函数可以获取当前函数调用的堆栈信息,并且通过跳过参数和自定义过滤条件即可拿到错误的产生位置。具体的实现过程如下:
对外提供的2个函数的实现
类型错误结构{ 犯错的错误 味精的字符串 fullMsg字符串 加亮 } func Errf(错错误,格式字符串,args…接口{})*{错误 艾凡:=,错误{ 错:呃, 味精:fmt。Sprintf(格式,args), } e。fullMsg=e.genFullMsg () 返回e } func犯错(错错误,args…接口{})*{错误 艾凡:=,错误{ 错:呃, 味精:fmt.Sprint (args), } e。fullMsg=e.genFullMsg () 返回e }
堆栈信息的实现
异常堆栈式结构{//栈的信息 数据串 调用者[]uintptr } func(呃*误差)字符串getStackTrace () { 如果strings.TrimSpace (err.data)==" { 返回err.genStackTrace (5) } 返回err.data } func(呃*误差)字符串加亮(){ 返回err.data } func(呃*误差)genStackTrace字符串(跳过int) { 如果配置。isPrintStack==1 { var缓冲bytes.Buffer buffer.WriteString(“加:\ n”) 圣[64]uintptr var n:=运行时。调用者(跳过,圣[:]) 犯错。调用者=圣(n): 帧:=runtime.CallersFrames (err.callers) 为{ 帧,好:=frames.Next () 如果!好{ 打破 } 如果! strings.Contains(框架。文件,运行时/){ buffer.WriteString (fmt.Sprintf (“% s \ n \ t % s: % d \ n”, frame.Func.Name(),框架。文件,frame.Line)) } } 犯错。data=https://www.yisu.com/zixun/buffer.String () 返回err.data } 返回" }
错误信息显示配置的实现
常量(//打印堆栈信息 PRINTSTACK=1 )//全局错误配置对象 var配置* errConfig=, errConfig {}//错误配置 errConfig struct类型{ isPrintStack uint32 }//设置错误配置信息 func SetConfig (conf字节){ 如果(相依,PRINTSTACK) !=0 { atomic.CompareAndSwapUint32(及配置。isPrintStack 0 1) } }
测试
func init () { errors.SetConfig (errors.PRINTSTACK) } 函数main () { 答:=func () { 错:=错误。犯错(nil,“这是一个内部错误”) fmt.Print (err.StackTrace ()) b:=错误。Errf(呃,“这是一个% s的消息”,“测试”). error () fmt.Println (b) } 一() }
错误信息如下所示
,
<强>结尾强>
该工具包只是对错误信息和堆栈信息的封装,还存在含多不足的地方。如果各位有好的意见。欢迎指点。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。