基于Go中的错误类型的细粒度错误处理

时间:2015-07-09 17:34:16

标签: go error-handling try-catch

TLDR:某个库中有一个函数,它通过网络执行某些操作,但可能会因错误而失败。错误可能表示输入参数错误,凭据无效,网络故障......而且......我不知道还有什么。这就是问题所在。

如何正确处理网络故障,我怎么知道会发生什么错误。

长版: 这是处理Go代码

中的错误的一种非常常见的方法
function f0() (v Value, err Error) {
  v2, err := f3()
  if err != nil {
    return
  }

  v1, err := f2(v2)
  if err != nil {
    return
  }

  v, err = f1(v1)
  return
}

Go代码中也很常见的是不记录返回的错误类型。 我们不要忘记Go中另一个常见的习语

err = errors.New("Boo! I failed") // returns trivial errorString

这导致f0()的来电者可能会收到数十个错误的情况(如果我的示例中f3()f1()也会进行一些调用),这代表了概念上不同的问题。

如何区分所有这些错误?

1 个答案:

答案 0 :(得分:0)

实现此最小接口的任何内容都是错误的;

type error interface {
    Error() string
}

简单的解决方案是;

type BadCredsError string

func (e BadCredsError) Error() string {
      return string(e)
} 

基本上,只需定义自己的类型,然后就可以使用类型开关或类型断言来确定特定的错误类型,就像你在更多的OO语言中看到的那样,如C#和Java。

顺便说一句,我的示例就像一段2秒的伪代码片段。 go博客在这里进行了更深入的讨论; http://blog.golang.org/error-handling-and-go