我一直在阅读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
}
但是我不确定如何以及用什么替换这些问号。
答案 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无论如何。