Go中的自定义错误处理

时间:2013-03-17 14:48:37

标签: error-handling go

我一直在阅读this blog post,但我仍然不相信我确切地知道如何处理自定义错误,我可以从我的函数返回并在其外部处理。

这就是我目前正在做的事情:

func doSomething() int {
    x := 0
    // Do something with x.
    ...
    if somethingBadHappened {
        return -1
    }
    if somethingElseBadHappened {
        return -2
    }
    return x
}

这就是我想要做的事情:

func doSomething() int, ? {
    ...
    if somethingBadHappened {
        return ?, err
    }
    if somethingElseBadHappened {
        return ?, err2
    }
    return x, nil
}

但是我不确定如何以及用什么替换这些问号。

2 个答案:

答案 0 :(得分:8)

如果你不想,你真的不需要返回一个int。你可以这样做:

func doSomething() error {
  ...
  if somethingBadHappened {
      return errors.New("something bad happened")
  }
  if somethingElseBadHappened {
      return errors.New("something else bad happened")
  }
  return nil
}

或者如果你想返回ints

func doSomething() (int, error) {
  ...
  if somethingBadHappened {
      return -1, errors.New("something bad happened")
  }
  if somethingElseBadHappened {
      return -2, errors.New("something else bad happened")
  }
  return x, nil
}

请务必在顶部import "errors"

如果您想测试是否有错误,可以

x, err := doSomething()
if err != nil {
  log.Println(err)
}

答案 1 :(得分:4)

我会转向

func doSomething() int, ? {
        ...
        if somethingBadHappened {
                return ?, err
        }

        if somethingElseBadHappened {
                return ?, err2
        }

        return x, nil
}

func doSomething() (r int, err error) {

        ...

        if somethingBadHappened {
                err  = err1 // Whatever satisfies the `error` interface
                return
        }

        if somethingElseBadHappened {
                err = err2 // dtto
                return
        }

        return x, nil
}

IOW,在调用网站上,如果错误!= nil,忽略,永远不会使用或依赖任何其他返回值,这是惯用*,所以只是不在乎上面的r是否被分配了一些中间值与否。

(*)在第一个近似中,即如果没有另外说明。例如。 io.Reader明确声明可以同时返回err == io.EOF和有效数据:

  

当Read成功读取n>后遇到错误或文件结束条件时0字节,它返回读取的字节数。它可以从同一个调用返回(非零)错误,或者从后续调用中返回错误(和n == 0)。这种一般情况的一个例子是Reader在输入流的末尾返回非零数量的字节可能返回err == EOF或err == nil。下一个Read应该返回0,EOF无论如何。