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
,但不是必须的。在OPx
中,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
}