登录
首页 >  Golang >  Go问答

覆盖错误。Is() 不适用于自定义错误

来源:stackoverflow

时间:2024-04-07 16:27:35 188浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《覆盖错误。Is() 不适用于自定义错误》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我正在尝试在 go 中创建一个自定义错误,以便我可以使用自定义消息创建该错误的新实例,然后处理该特定类型的错误。但是,当我尝试执行此操作时,我的重写 errors.is() 不会被执行。这是我的代码:

package main

import (
        "fmt"
        "errors"
)

type Error struct {
        Message string
        Code int
}

func (e *Error) Error() string {
        return e.Message
}

func (e Error) Is(target Error) bool {
        // This is never printed - this method never excutes for some reason
        fmt.Println("compared!")
        return e.Code == target.Code
}

var NotFoundError *Error = &Error{Code: 404, Message: "The page was not found"}

func NewError(errorType *Error, message string) error {
        rc := *errorType
        rc.Message = message

        return &rc
}

func FetchImage() error {
        return NewError(NotFoundError, "That image is gone")
}

func main() {
        err := FetchImage()

        // Returns false
        fmt.Println(errors.Is(err, NotFoundError))
}

在这种情况下,对 errors.is() 的调用返回 false。然而,尽管我提供了自己的 is() 函数,但该函数根本没有被调用。也就是说,字符串 "compared!" 永远不会被打印。

为什么我的 is() 函数没有按预期工作?


解决方案


type error struct {
        message string
        code int
}

func (e *error) error() string {
        return e.message
}

func (e *error) is(tgt error) bool {
        // this is never printed - this method never excutes for some reason
        fmt.println("compared!")
        target, ok := tgt.(*error)
        if !ok{
          return false
        }
        return e.code == target.code
}

您的错误结构未正确实现 is 方法,参数应为 error 而不是 error

查看实际效果:

https://play.golang.org/p/vRQndE9ZRuH

您可以使用这个:

package main

import (
        "fmt"
)

type Error struct {
        Message string
        Code int
}

func (e *Error) Error() string {
        return e.Message
}

func (e *Error) Is(target Error) bool {
        // This is now printed
        fmt.Println("compared!")
        return e.Code == target.Code
}

var NotFoundError Error = Error{Code: 404, Message: "The page was not found"}

func NewError(errorType Error, message string) Error {
        rc := errorType
        rc.Message = message

        return rc
}

func FetchImage() Error {
        return NewError(NotFoundError, "That image is gone")
}

func main() {
        err := FetchImage()

        // Now it returns true
        fmt.Println(err.Is(NotFoundError))
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>