当前位置: 首页 > news >正文

新疆乌鲁木齐建设工程信息网百度seo排名点击软件

新疆乌鲁木齐建设工程信息网,百度seo排名点击软件,wordpress 邮件订阅,北京it外包公司排行榜错误处理实践 我们在go语言中设计error的处理体系时候, 一般都会去做下面两点 直接使用errors.New()生成error接口的值 扩展error接口, 并定义扩展error接口的实现类型 error接口是什么? go语言的error是一个接口类型, 其源码如下: type error interface {Error() string…

错误处理实践

我们在go语言中设计error的处理体系时候, 一般都会去做下面两点

直接使用errors.New()生成error接口的值
扩展error接口, 并定义扩展error接口的实现类型

error接口是什么?

go语言的error是一个接口类型, 其源码如下:

type error interface {Error() string
}

我们可以定义它的实现类型, 比如我们经常使用到的errors.New()方法, 返回值为一个error接口的实现类型*errorString的结构体字面量

package errorsfunc New(text string) error {return &errorString{text}
}type errorString struct {s string
}func (e *errorString) Error() string {return e.s
}//package main
xxxerr := errors.New("xxx")

所以我们可以直接调用errors.New()为我们生成一个error接口的值

扩展的error接口

我们为什么需要对error接口进行扩展呢?, 原因是error的实现类型范围太大了, 细粒度不够小, 所以我们需要实现更加精细的控制, 关于这种设计我们可以参考go语言标准库中的一些error处理代码, 比如下面的

type Error interface {//嵌入了error接口, 实现net.Error也会实现errorerror//扩展Timeout() boolTemporary() bool
}

然后我们又可以定义一个类型来实现这个扩展错误接口类型, 比如下面这个OpError:

type OpError struct {Op stringNet stringSource AddrAddr AddrErr error
}//实现函数1
func (e *OpError) Error() string {return ""
}//下面是实现函数2
func (e *OpError) Timeout() bool {//对应的处理逻辑return true
}//下面是实现函数2
func (e *OpError) Temporary() bool {}

我们发现该结构体中存在一个名字叫做Err的类型为error的字段, 它代表了该错误的潜在错误, 有可能OpError类型的错误值还包含了AddrError这种错误
通过这种类型建立起树形的错误体系, 用统一字段建立可追溯的链式错误关联, 我们就可以建立起来一套优秀的错误处理机制
为了更好的表示, 我画了一张图

在这里插入图片描述

具体的错误

因为Go语言的error是一个接口, 所以这个它的值的实际类型是非常复杂的, 于是我们就需要去判断它的值的一个实际类型

如果错误值在某一个范围内, 我们可以使用类型断言表达式或者类型断言+switch语句进行判断
对于已有相应变量且类型相同的一系列错误值, 一般直接使用判等操作 + switch语句
没有相应变量且类型未知的一系列错误值, 只能使用其错误信息的字符串表示形式来判断

下面我们分别来看上面的内容: 首先是第一点, 已知错误值的范围比如: {os.PathError|os.LinkError|os.SyscallError|exec.Error}, 是它们中的一个, 我们可以直接使用类型断言+switch, 然后返回潜在错误类型

func underlyingError(err error) error {switch err := err.(type) {case *os.PathError:return err.Errcase *os.LinkError:return err.Errcase *os.SyscallError:return err.Errcase *exec.Error:return err.Err}return err
}

当我已经知道某个错误是哪一个, 我们直接使用判等操作+switch,

printError := func(i int, err error) {if err == nil {fmt.println("nil error")return}err = underlyingError(err)switch err {  case os.ErrClosed:    fmt.Printf("error(closed)[%d]: %s\n", i, err)  case os.ErrInvalid:    fmt.Printf("error(invalid)[%d]: %s\n", i, err)  case os.ErrPermission:    fmt.Printf("error(permission)[%d]: %s\n", i, err)  }
}

通过上面这种直接判等操作, 我们就可以锁定具体的错误值了

对于上面两种情况, 我们都会有比较明确的方法去解决, 但是我们对一个错误值可能代表的含义知道的很少, 那么就只能通过错误信息去判断了

http://www.ds6.com.cn/news/26763.html

相关文章:

  • 山东超越建设集团网站网上商城建设
  • 南通网站制作公司搜搜
  • 莱芜做网站优化头条今日头条
  • 中国建设银行网站登录不上百度贴吧广告投放价格
  • php网站后台密码忘记了完整企业网站模板
  • 网络规划设计师是职业资格吗优化网站价格
  • wordpress免费主题cms关键词优化公司网站
  • 目前网站在初级建设阶段_需要大量数据丰富英文网站seo
  • 用什么程序做网站好百度帐号个人中心
  • 网站社区怎么创建黑帽seo是什么
  • 网站建设的主要技术指什么怎样在百度上发帖子
  • 做视频网站用哪个软件好在线bt种子
  • 产品网站用什么软件做清远今日头条最新消息
  • 网站名称管理高报师培训机构排名
  • 濮阳市网站建设五年级上册优化设计答案
  • 建设网站天下拼多多怎么查商品排名
  • 崇左网站建设竞价排名适合百度这样的网络平台吗
  • 安徽省工程建设项目信息网沧州seo公司
  • 成都网络优化网站建设百度 seo优化作用
  • 互联网网站如何做流量统计网络营销推广活动有哪些
  • 优而思 网站网络推广优化工具
  • iis7.5怎么做网站千锋教育培训多少钱费用
  • 深圳注册公司流程及资料怎样在网上办理优化网站的软件下载
  • 网站制作技术人员谷歌优化
  • 开发一个网站需要的技术天津seo优化排名
  • 国内做外贸如何访问外国网站百度seo优化系统
  • 四级a做爰片免费网站关键字搜索
  • 烟台做网站要多少钱培训推广 seo
  • 网站建设必须配置自己开一个培训机构流程
  • 济南做网站多钱网络推广的工作好做吗