Error handling Go中的自定义错误处理

Error handling Go中的自定义错误处理,error-handling,go,Error Handling,Go,我一直在阅读,但我仍然不确信我确切地知道如何获得自定义错误,我可以从函数返回这些错误并在它们之外进行处理 这就是我目前正在做的: func doSomething() int { x := 0 // Do something with x. ... if somethingBadHappened { return -1 } if somethingElseBadHappened { return -2 }

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

这就是我目前正在做的:

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
}

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

如果不想返回int,则不需要返回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
}
确保在顶部导入“错误”

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

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

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

        if somethingElseBadHappened {
                return ?, err2
        }

        return x, nil
}
进入

注意,在调用站点,如果出现错误,则忽略、从不使用或依赖任何其他返回值都是惯用的nil,所以不必在意上面的
r
是否被分配了一些中间值

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

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


嗯,为了满足错误接口,我只需要创建一些新的结构类型,其中包含一个字符串变量,并创建一个错误实现,对吗?或者有更简单的方法吗?@jnml-不应该
返回x,nil
返回r,nil
?@Ekkehard.Horner:也可以是
返回r,nil
,但不是必须的。在OP
x
中,x代表一个局部变量,在这里的意思也是一样的。通常,最后一行可以是
return
reuturn expr1,expr2
@Knyght:创建特殊错误值的简单方法是使用@jnml的返回值-但是您的函数没有
x
,普通的
return
s将返回
r
,您在解释文本中提到了
r
的可能值。
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
}