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

网站推广的宣传途径贺州网站seo

网站推广的宣传途径,贺州网站seo,网信办抓好网站建设,化妆品网站建设预算引言 Go提供了两种在标准库中创建错误的方法#xff0c;[errors.New和fmt.Errorf]#xff0c;当与用户交流更复杂的错误信息时#xff0c;或在调试时与未来的自己交流时#xff0c;有时这两种机制不足以充分捕获和报告所发生的情况。为了传达更复杂的错误信息并实现更多的…引言 Go提供了两种在标准库中创建错误的方法[errors.New和fmt.Errorf]当与用户交流更复杂的错误信息时或在调试时与未来的自己交流时有时这两种机制不足以充分捕获和报告所发生的情况。为了传达更复杂的错误信息并实现更多的功能我们可以实现标准库接口类型error。 其语法如下: type error interface {Error() string }builtin包将error定义为一个接口它只有一个Error()方法返回一个字符串形式的错误消息。通过实现这个方法我们可以将定义的任何类型转换为我们自己的error。 让我们尝试运行以下示例来查看error接口的实现: package mainimport (fmtos )type MyError struct{}func (m *MyError) Error() string {return boom }func sayHello() (string, error) {return , MyError{} }func main() {s, err : sayHello()if err ! nil {fmt.Println(unexpected error: err:, err)os.Exit(1)}fmt.Println(The string:, s) }Outputunexpected error: err: boom exit status 1在这里我们创建了一个新的空结构类型MyError并在其上定义了Error()方法。Error()方法返回字符串boom。 在main()中我们调用函数sayHello该函数返回一个空字符串和一个新的MyError实例。由于sayHello总是会返回错误所以main()中的if语句体中的fmt.Println调用总是会执行。然后我们使用fmt.Println打印短前缀字符串unexpected error:以及err变量中保存的MyError实例。 请注意我们不必直接调用Error()因为fmt包能够自动检测这是Error 的实现。它透明地调用Error()来获取字符串boom并将其与前缀字符串unexpected Error: err:连接起来。 在自定义错误中收集详细信息 有时候自定义错误是捕获详细错误信息的最简洁方式。例如假设我们想要捕获HTTP请求产生的错误的状态码;运行以下程序来查看error的实现它允许我们清晰地捕获信息: package mainimport (errorsfmtos )type RequestError struct {StatusCode intErr error }func (r *RequestError) Error() string {return fmt.Sprintf(status %d: err %v, r.StatusCode, r.Err) }func doRequest() error {return RequestError{StatusCode: 503,Err: errors.New(unavailable),} }func main() {err : doRequest()if err ! nil {fmt.Println(err)os.Exit(1)}fmt.Println(success!) }Outputstatus 503: err unavailable exit status 1在这个例子中我们创建了一个新的RequestError实例并使用标准库中的errors.New函数提供状态码和一个错误。然后像前面的例子一样我们使用fmt.Println打印它。 在RequestError的Error()方法中我们使用fmt.Sprintf函数来使用创建错误时提供的信息来构造一个字符串。 类型断言和自定义错误 error接口只公开了一个方法但我们可能需要访问error实现的其他方法来正确处理错误。例如我们可能有几个临时的error自定义实现可以通过存在的 temporary()方法进行检索。 接口为类型提供了更广泛的方法集合因此我们必须使用类型断言来更改view正在显示的方法或者完全删除它。 下面的例子在之前的RequestError的基础上增加了一个Temporary()方法该方法将表明调用者是否应该重试请求: package mainimport (errorsfmtnet/httpos )type RequestError struct {StatusCode intErr error }func (r *RequestError) Error() string {return r.Err.Error() }func (r *RequestError) Temporary() bool {return r.StatusCode http.StatusServiceUnavailable // 503 }func doRequest() error {return RequestError{StatusCode: 503,Err: errors.New(unavailable),} }func main() {err : doRequest()if err ! nil {fmt.Println(err)re, ok : err.(*RequestError)if ok {if re.Temporary() {fmt.Println(This request can be tried again)} else {fmt.Println(This request cannot be tried again)}}os.Exit(1)}fmt.Println(success!) }Outputunavailable This request can be tried again exit status 1在main()中我们调用doRequest()它会返回一个error接口给我们。我们首先打印 error()方法返回的错误消息。接下来我们尝试使用类型断言re, ok : err.(*RequestError)来暴露RequestError中的所有方法。如果类型断言成功那么我们使用Temporary()方法来查看此错误是否为临时错误。由于doRequest()设置的StatusCode是503这与http.StatusServiceUnavailable匹配因此返回true并导致打印 this request can be try again。在实践中我们会发送另一个请求而不是打印一条消息。 包装错误 通常错误会在程序之外产生例如:数据库、网络连接等。这些错误提供的错误消息不能帮助任何人找到错误的根源。在错误消息的开头使用额外的信息包装错误可以为成功调试提供一些必要的上下文。 下面的例子演示了我们如何将一些上下文信息附加到从其他函数返回的晦涩的error上: package mainimport (errorsfmt )type WrappedError struct {Context stringErr error }func (w *WrappedError) Error() string {return fmt.Sprintf(%s: %v, w.Context, w.Err) }func Wrap(err error, info string) *WrappedError {return WrappedError{Context: info,Err: err,} }func main() {err : errors.New(boom!)err Wrap(err, main)fmt.Println(err) }Outputmain: boom!WrappedError是一个有两个字段的结构体:一个是string类型的上下文消息另一个是error类型WrappedError提供了更多的信息。当Error()方法被调用时我们再次使用fmt.Sprintf来打印上下文消息然后Error(fmt.Sprintf也知道隐式调用Error()方法)。 在main()中我们使用errors.New创建一个错误然后使用我们定义的wrap函数包装这个错误。这允许我们指出这个error是在main中生成的。此外由于我们的WrappedError也是一个error我们可以包装其他的WrappedError这将允许我们看到一个链来帮助我们追踪错误的来源。在标准库的帮助下我们甚至可以在错误中嵌入完整的堆栈跟踪。 总结 由于error接口只有一个方法我们已经看到我们可以为不同的情况提供不同类型的错误。这可以涵盖从将多条信息作为错误的一部分进行沟通到实现指数回退的所有事情。虽然Go中的错误处理机制表面上看起来很简单但我们可以使用这些自定义错误来处理常见和不常见的情况从而实现相当丰富的处理。 Go还有另一种沟通意外行为的机制panics。在错误处理系列的下一篇文章中我们将研究恐慌——它们是什么以及如何处理它们。
http://www.hkea.cn/news/14375605/

相关文章:

  • 益阳网站seo网页相册制作
  • 北京哪家做网站wordpress 远程调用函数
  • 哪里有做区块链网站的网站开发建站
  • 吉林市做网站哪家好建设云购网站
  • 廊坊公司网站建设百度网站怎样做推广
  • 深圳专业建网站公司排行厦门人才网招聘
  • 北京网站建设公司网站优化资讯免费网站建站 知乎
  • 莆田 做网站的公司wordpress是什么软件
  • 滨江网站建设公司wordpress表单邮件
  • 网站被恶意解析app推广软件有哪些
  • 爱的网站台州汇客网站建设
  • 泰安企业网站seo电商网站国内外需求分析
  • 初学者自己做网站洞头区小程序模板源代码
  • 国内做房车游网站九江有没有做网站的公司
  • 网站源码文件公司如何申请域名
  • 一级做爰片a视频网站试看网页升级紧急通知在哪里看
  • 设计企业网站内容单位建设网站硬件
  • 网站流量 龙优化软件天津网站设计网站制作
  • 沈阳中联做网站广州企业网站建设报价
  • 汕头h5建站模板网络公司企业网站源码
  • 栖霞区住房和建设局网站烈焰网页游戏传奇
  • 莆田兼职做外贸网站免费企业自助建站信息发布网
  • 建立网站批复北京百度总部
  • 网站媒体作风建设年工作总结烟台市做网站找哪家好
  • 南山网站建设方案书wordpress 文章登陆可见
  • 免费的网站后台管理系统html企业网站怎么做
  • 大学做视频网站wordpress可以做电影网站吗
  • 扬州高端网站建设韶关市手机网站建设怎么样
  • 龙岗附近做网站公司什么是响应式营销型网站建设
  • 慈溪住房和城乡建设部网站管理系统是网站吗