You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言如何实现多层级自定义错误类型的继承与属性预设

实现方案

第一步:定义FailedTo错误类型

通过结构体嵌入*CustomError继承原有能力,工厂函数自动添加Failed to前缀、默认状态码设为500。

import "fmt"

// FailedTo 继承CustomError的所有能力,默认状态码500,错误信息自动带Failed to前缀
type FailedTo struct {
    *CustomError // 嵌入已有CustomError指针,实现类型兼容
}

// NewFailedTo FailedTo类型工厂函数
// operate参数为具体操作描述,比如"create resource"、"query database"
// err参数为原始被包装错误
func NewFailedTo(operate string, err error) *FailedTo {
    msg := fmt.Sprintf("Failed to %s", operate)
    return &FailedTo{
        CustomError: NewCustomError(msg, 500, err),
    }
}

第二步:定义FailedToCreateSomething错误类型

同样通过嵌入*FailedTo实现多层类型兼容,工厂函数完全匹配你给出的调用格式。

// FailedToCreateSomething 特定场景错误类型,继承FailedTo所有能力
type FailedToCreateSomething struct {
    *FailedTo // 嵌入FailedTo指针,实现多层类型兼容
}

// FailedToCreateSomething 工厂函数,和示例调用方式完全匹配
func FailedToCreateSomething(err error) *FailedToCreateSomething {
    return &FailedToCreateSomething{
        // 固定操作描述为"create something",符合类型语义
        FailedTo: NewFailedTo("create something", err),
    }
}

类型断言验证

你给出的示例代码返回的errCreateSomething可同时通过三种类型校验,用errors.As的校验示例如下:

import "errors"

func createSomething() error {
    return FailedToCreateSomething(errors.New("File is busy"))
}

func main() {
    errCreateSomething := createSomething()
    
    // 校验是否为CustomError类型:匹配成功
    var ce *CustomError
    if errors.As(errCreateSomething, &ce) {
        println("匹配CustomError成功,错误信息:", ce.Message)
    }

    // 校验是否为FailedTo类型:匹配成功
    var ft *FailedTo
    if errors.As(errCreateSomething, &ft) {
        println("匹配FailedTo成功,状态码:", ft.StatusCode)
    }

    // 校验是否为FailedToCreateSomething类型:匹配成功
    var ftcs *FailedToCreateSomething
    if errors.As(errCreateSomething, &ftcs) {
        println("匹配FailedToCreateSomething成功,原始错误:", ftcs.Err.Error())
    }
}

内容的提问来源于stack exchange,提问作者Thales P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:15:03