4

我一直在阅读这篇博文,但我仍然不相信我确切知道如何获取自定义错误,我可以从我的函数返回并在它们之外进行处理。

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

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
}

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

4

2 回答 2

8

如果你不想,你真的不需要返回一个 int 。您可以执行以下操作:

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

或者如果你想返回整数

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)
}
于 2013-03-17T15:00:52.460 回答
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,在调用站点,如果 err != nil 忽略、从不使用或依赖任何其他返回值是惯用的*,所以只要不关心r上面是否已经分配了一些中间值。

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

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

于 2013-03-17T15:31:09.583 回答