错误处理:返回内置错误与自定义类型



在Go的标准库中,内置的error用于错误处理。这篇文章使用了std-libs中的一些例子来演示Go中的错误处理是如何工作的。

package net
type Error interface {
error
Timeout() bool   // Is the error a timeout?
Temporary() bool // Is the error temporary?
}
if nerr, ok := err.(net.Error); ok && nerr.Temporary() {
time.Sleep(1e9)
continue
}
if err != nil {
log.Fatal(err)
}

我想知道坚持这个惯例会有什么好处。如果我们返回自定义类型呢?例如CCD_ 2类型。

我假设您谈论的是DoRequest() errorDoRequest() net.SomeSpecificError之间的差异。

以下代码


type CustomError struct {
}
func (CustomError) Error() string {
return "custom error"
}
func DoRequest() *CustomError {
return nil
}
func MarkTaskComplete() error {
return nil
}
func main() {
err := DoRequest()
if err != nil {
log.Fatal(err)
}
err = MarkTaskComplete()
if err != nil {
log.Fatal(err)
}
}

将无法编译,因为MarkTaskComplete返回的错误无法分配给类型为*SomeError的错误变量。

第二个缺点是不能从DoRequest返回除SomeError以外的任何其他错误。在某些情况下,您可能会从这样的限制中受益,但在大多数情况下,error的方法更灵活。尤其是当您的函数调用另一个函数时。

同样值得一读的是包装的错误

客户类型的好处,即网络。错误为:

type Error interface {
error
Timeout() bool   // Is the error a timeout?
Temporary() bool // Is the error temporary?
}

以上内容的优点是更具描述性。我们将获得有关该错误的更多信息,比如它是超时错误还是临时错误。

除此之外,我们还了解了主字段"中的主数据;错误";,在上面的例子中,它是一个字符串。

type error interface {
Error() string
}

最新更新